【问题标题】:Will Cython speed up erf() calculations?Cython 会加速 erf() 计算吗?
【发布时间】:2015-03-20 15:47:54
【问题描述】:

我正在考虑从 MATLAB 切换到 Python。我的 MATLAB 代码的核心在几千个数字的数组上反复调用 erf,例如:

r=rand(1,1e5)

erf(r)

这是我在 Python 中的实现:

import numpy as np
import scipy.special as sps

r=np.random.rand(1e5)

sps.erf(r)

Python 版本大约需要三倍的时间。如果我使用 Cython 来编译程序的这个核心,我会看到一个重大的加速吗?我的 Python 经验很少,也没有 C 经验,所以我想在尝试了解 Cython 之前先看看这里。

【问题讨论】:

  • 你是如何测量python版本的?对几千个数字计算 erf 似乎并不太苛刻。上下文也可能很重要,因为“python 很慢”,更大的瓶颈将是你的代码调用 python 的频率,而不是在 numpy 内部进行提升。进行“更完整”(在算法更多的意义上)测试可能会产生更详细的信息。
  • 顺便说一下,在我的电脑上调用sps.erf(np.random.rand(1e5)) 大约需要4ms。如果这确实是您的用例(而不是在循环中调用该函数 1000 次),那么您考虑该函数所花费的时间比您节省的时间要多得多。
  • 性能差异主要是erf还是rand?我猜是后者。如果您真的想加快代码速度,请自己在 Matlab mex 或任何与此等效的 Cython 中实现更快的随机数生成器。例如:Double precision SIMD-oriented Fast Mersenne Twister 或超级简单甚至更快的xorshift+ and xorshift* generators,如果您不需要这么长的时间。
  • @Carsten:我正在做 MCMC 采样,所以我打电话给erf 数百万或数十亿次。
  • @horchler:我尝试将rand 排除在外(我在这里仅将其用作真实数据的占位符),但它仍然认为MATLAB 的erf 更快。

标签: python matlab scipy cython


【解决方案1】:

我不希望 Cython 能够加快速度。所有耗时的工作都在sps.erfnp.random.rand 内部完成; Python 解释器只是传递数组。

在 MATLAB 术语中,当您无法完全矢量化计算时,Cython 最有可能提供帮助。

您可能需要考虑向 SciPy 开发人员报告这种性能差异。也许有一个很容易修复的错误。

【讨论】:

猜你喜欢
  • 2014-10-02
  • 1970-01-01
  • 2016-04-02
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多