代码详解:如何用Python运行高性能的数学范式?
比较python中不同运行范式的表现情况
对于任何以数据为中心的学科来讲,其主要任务之一是使科学计算和数值计算更较迅速。对于以性能为核心的应用程序和数据处理通道来讲,需要运行最佳范例并选择正确的库集。那么,在开发和学习中有哪些技巧呢?
首先需要明确的是:编写python代码和编写pythonic代码之间存在很大差异。
这篇文章围绕一些最常用的数据科学操作编写了最佳(也存在争议的)实践。例如通过使用numpy矢量化、并行计算和多线程来评估复杂的数学表达式,对ndarrays进行初始化。
定义数学表达的功能
处理大量数字是一项具有挑战性的任务,如果要对这些元素进行数值运算,结果就会完全改变。
假设有一个数学表达式要在具有100,000个数字的数组上进行评估:
y = |sin(x) + cos(x)|
使用范围函数创建数字列表:
n = 1000000
data_num = range(n)
让我们看看各种运行情况,最后会将所有使用timeit库的运行情况进行比较:
1.一种非常简单和直接的方法是遍历整个数据集,并将函数f(x)(上面定义)的输出附加到输出列表对象。
otpt = []
for x in data_list:
otpt.append(f(x))
2.我们可以使用这些迭代器:
return [f(x) for x in data_list]
3.使用python的eval()方法可以实现相同的目的:
exp = 'abs(cos(x) + sin(x)) ** 0.5'
return [eval(exp) for x in data_list]
4. 我们可以使用numpy vectorization tack实现相同的算法。
import numpy as np
data_np = np.arange(1000000)
def f4(data_np):
"""using the numpy vectorization
"""
return (np.abs(np.cos(data_np) + sin(data_np)) ** 0.5)
5.另一个专门用于评估这种数值表达式的库是numexpr。 这个库之所以变得非常便捷,是因为内置的多线程支持。
import numexpr as ne
ex = 'abs(cos(a) + sin(a)) ** 0.5'
ne.set_num_threads(5)
return ne.evaluate(ex)
我们列出了5种不同的范例来执行相同的操作。现在是时候检查它们是否产生了相同的输出。
将每个函数的输出记录为otpt1,otpt2等,以此类推。
我们可以使用numpy的allclose()方法来检查两个ndarray对象。
np.allclose(otpt1, otpt2)
np.allclose(otpt1, otpt3)
np.allclose(otpt1, otpt4)
np.allclose(otpt1, otpt5)
对于我们来说,他们应该都回归最重要的问题,这也是这篇文章的焦点:
与处理时间相比,每个范例是如何进行比较的。这个函数将帮助我们获得每个时间函数。
将所需参数传递给上述函数后,该函数使用timeit repeat来评估时间并对观察到的值进行排序。
function_list = ['f1', 'f2', 'f3', 'f4', 'f5']
data_com_list = ['data_num', 'data_num', 'data_num', 'data_np', 'data_np']
record_comp_time(function_list, data_com_list)
我们得到以下性能速度:
从比较结果中可以清楚地看到,使用numexpr的函数在记录时间内产生输出,之后是使用numpy库的函数4。
下面是在Github上运行的链接,用于整个代码基础:
harshitcodes/python_paradigms
A guide to: How to compare different implementation paradigms in python? - harshitcodes/python_paradigms_github.com
结论
对于任何数据密集型操作,python都有许多方法可以提高代码的性能。如果出现问题,以通过使用不同范例和选择正确的库来进行组合以实现最优性。除了范例之外,还有一些非常有用的库可以提高python代码的执行速度。
numexpr具有广泛的操作范围,这使得数值计算更加平稳和快速,下面其中一些操作。
- Cython将Python的编写与C语言的速运行度相融合。
- Numba ,- 它动态地为CPU编译Python代码。
- Python内置模块multiprocessing能够进行并行处理。
编译组:草田
相关链接:
https://www.codementor.io/harshittyagi/high-performance-mathematical-paradigms-in-python-pjc5yocqm
如需转载,请后台留言,遵守转载规范