【发布时间】:2017-10-26 16:07:41
【问题描述】:
我有一个非常简单的例子,它表明 NumPy 的 np.exp 比 Matlab 慢大约 10 倍。如何加快 Python 速度?我正在运行 32 位 Python 2.7、NumPy 版本 1.11.3,而 numpy 正在使用 MKL blas & lapack 库。
而且,时间上的差异是如此之大,以至于我认为计时机制没有太大的影响。
Python 中的代码示例:
import numpy as np
import timeit
setup='import numpy as np; import numexpr as ne; n=100*1000; a = np.random.uniform(size=n)'
time = timeit.timeit('b=np.exp(a)', setup=setup, number=1000)
print 'Time for 1000 (np.exp): ',time
time = timeit.timeit('b=ne.evaluate("exp(a)")', setup=setup, number=1000)
print 'Time for 1000 (numexpr): ',time
结果:
Time for 1000 (np.exp): 2.25906916167
Time for 1000 (numexpr): 0.591470532849
在 Matlab 中:
a = rand([100*1000,1]);
times = [];
for i=1:1000,
tic
b = exp(a);
t=toc;
times(i) = t;
end
fprintf('Time for 1000: %f\n',sum(times));
导致:
Time for 1000: 0.268527
【问题讨论】:
-
timeit 文档说没有多行字符串文字。如果将其作为 timeit 运行的一部分进行评估,我猜测您在设置部分中传递的方式。您可以通过在 python 中模仿 matlab 中的 tic/tock 设置来进行直接的苹果对苹果的比较。
-
@SlaterTyranus:文档说
stmt和setup不能包含 多行字符串文字,并不是说它们本身不能跨越多行。我相信这是因为reindenthelpertimeit用于调整多行输入的缩进会破坏输入中的多行字符串文字。 -
另外,至于如何让它更快的问题,这实际上与 numpy 无关,而与你在引擎盖下的 lapack 无关。如果你想改进它,那就是你必须关注的地方。
-
是的,我将设置字符串更改为用分号分隔的单个字符串,相同的计时结果。
-
@user2357112 我的错。我过去遇到过一些微妙的问题,并且无法在心理上解析输入字符串。
标签: python matlab performance numpy