我有一个非常简单的例子,它表明 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

最佳答案

为了提高性能,尤其是在大型数据集上,我们可以将 numexpr module 用于此类超越函数 -

import numexpr as ne

b = ne.evaluate('exp(a)')

基准测试

对于适当的基准测试,我会使用 timeit on MATLAB NumPy's %timeit -

设置 #1

MATLAB:
>> a = rand([100*1000,1]);
>> func = @() exp(a);
>> timeit(func)
ans =
    0.0013 % That's 1.3 m-sec

NumPy 在相同大小的数据集上:
In [417]: n=100*1000
     ...: a = np.random.uniform(size=n)
     ...:

In [418]: %timeit np.exp(a)
1000 loops, best of 3: 1.5 ms per loop

In [419]: %timeit ne.evaluate('exp(a)')
1000 loops, best of 3: 397 µs per loop

因此,
MATLAB  : 1.3 m-sec
NumPy   : 1.5 m-sec
Numexpr : 0.4 m-sec

设置 #2

MATLAB:
>> a = rand([1000*10000,1]);
>> func = @() exp(a);
>> timeit(func)
ans =
    0.0977  % That's 97 m-sec

NumPy :
In [412]: n=1000*10000
     ...: a = np.random.uniform(size=n)
     ...:

In [413]: %timeit np.exp(a)
10 loops, best of 3: 154 ms per loop

In [414]: %timeit ne.evaluate('exp(a)')
10 loops, best of 3: 36.5 ms per loop

因此,
MATLAB  :  97 m-sec
NumPy   : 154 m-sec
Numexpr :  36 m-sec

使用 tic-toc 进行适当的基准测试

问题中的基准测试的错误在于,我们在一个循环中获得了 toc 已用时间,该循环没有运行足够的时间来为我们提供任何准确的时间。普遍接受的想法是 toc 耗时必须至少接近 1 sec 标记。

因此,通过这些更正,使用 tic-toc 进行更准确的计时测试将是 -
tic
for i=1:1000,
    b = exp(a);
end
t=toc;
timing = t./1000

这产生 -
timing =
    0.0010

这与我们的 1.3 m-sectimeit 很接近。

关于python - 为什么 numpy 的 exp 比 Matlab 慢?如何让它更快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44190128/

10-14 18:16
查看更多