代码详解:如何用Python运行高性能的数学范式?

全文共1140字,预计学习时长3分钟

比较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能够进行并行处理。

留言 点赞 发个朋友圈

我们一起分享AI学习与发展的干货

编译组:草田

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181205B0NU7X00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券