为了提高性能(尤其是在大型数据集上的性能),我们可以将numexpr module用于此类先验功能-
import numexpr as ne
b = ne.evaluate('exp(a)')
标杆管理
设置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过去的计时,而该循环的运行时间不足以为我们提供任何准确的计时.普遍接受的想法是,经过时间的计时必须至少接近1秒标记.
因此,通过这些更正,使用tic-toc进行更准确的时序测试将是-
tic
for i=1:1000,
b = exp(a);
end
t=toc;
timing = t./1000
这产生-
timing =
0.0010
这已经接近我们的1.3毫秒.