为了提高性能,特别是在大型数据集上,我们可以利用^{} module来实现这种超越函数-import numexpr as ne
b = ne.evaluate('exp(a)')
标杆管理
为了进行适当的基准测试,我将使用^{}和{a3}-
设置1
MATLAB软件:
^{pr2}$
相同大小数据集上的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
纽比: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秒标记。在
所以,有了这些修正,用tic-toc更精确的计时测试将是-tic
for i=1:1000,
b = exp(a);
end
t=toc;
timing = t./1000
这就产生了-timing =
0.0010
这与我们的1.3 m-sec和timeit很接近。在