繁体   English   中英

加快Python中的数学计算速度

[英]Speed up mathematical calculations in Python

我目前正在尝试优化程序。 主要瓶颈实际上是在numpy数组上运行的相当简单的单行计算,例如:

(p-1) * c**(p-1)/(v_dt+c)**p

(这里的p和c是浮点数,而v_dt是〜500长的numpy浮点数数组)

此计算在我的机器上大约需要1/50秒

(使用timeit进行计时:1000次循环,每循环3:21.8毫秒的最佳时间)

问题在于,这个小函数(我也有其他几个类似的函数)在循环中每次迭代被调用约500次,并且循环运行约100次。 所以这一行突然增加了我20分钟的运行时间。

在python中加快数学计算的最佳方法是什么? python技巧可以完成多少工作? 我已经研究过c_types和Cython,但是如何使用它们呢? 我是否需要为这些瓶颈函数编写C代码,或者可以使用已经编译的库(我对c没有经验)。

非常感谢。

编辑:我忘了提,我已经在寻找循环的并行化选项,但仍想直接加速这些瓶颈功能,因为这是对性能至关重要的代码

在我的幼稚测试中,这看起来并不那么昂贵:

In [65]: p,c =2.,2.
In [66]: v_dt=np.ones(500)*1.5
In [67]: x=(p-1)*c**(p-1)/(v_dt+c)**p
In [68]: timeit x=(p-1)*c**(p-1)/(v_dt+c)**p
10000 loops, best of 3: 23.5 µs per loop

使用不同的pc贵一些

In [77]: p,c =2.123,1.324
In [78]: timeit x=(p-1)*c**(p-1)/(v_dt+c)**p
10000 loops, best of 3: 95.9 µs per loop

大多数时间是在向量乘幂运算中:

In [82]: %timeit v_dt**p
10000 loops, best of 3: 75.5 µs per loop

(这是在Windows7 vintage的Centron笔记本电脑上)。

cython或其他“自己动手”编译的代码不能做得更好。 numpy已经过调整,可以高效地执行这样的数学运算。

我认为您需要看大局。 为什么需要如此频繁地调用它? 您可以用较大的数组称它更少的时间吗?

我认为这篇文章令人惊讶且有趣。

快速总结:

  • 最有趣的是,对于小型数组(<150个元素),他发现Python实际上比Numpy更快。 我猜开销要少些。

  • 您也可以用C ++编写内部循环,然后通过Python调用它。

  • 您可以研究一下Numba,这似乎是加快简单计算速度的非常简单的方法。

最后,我通过重新组织函数获得了加速,因此向量部分仅被触摸了一次。

例如,代替(a * (b * (c * vector)))做3个向量乘法,您可以做(a * b * c) * vector ,做一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM