Numpy功能是否缓慢?

时间:2013-08-05 01:44:14

标签: python performance function numpy performance-testing

Numpy应该很快。但是,在将Numpy ufuncs与标准Python函数进行比较时,我发现后者要快得多。

例如,

aa = np.arange(1000000, dtype = float)
%timeit np.mean(aa) # 1000 loops, best of 3: 1.15 ms per loop
%timeit aa.mean # 10000000 loops, best of 3: 69.5 ns per loop

我和其他Numpy函数(如max,power)得到了类似的结果。我的印象是,Numpy的开销会使小型阵列的速度变慢,但对于大型阵列则会更快。在上面的代码中,aa不小:它有100万个元素。我错过了什么吗?

当然,Numpy很快,只有功能似乎很慢:

bb = range(1000000)
%timeit mean(bb) # 1 loops, best of 3: 551 ms per loop
%timeit mean(list(bb)) # 10 loops, best of 3: 136 ms per loop

2 个答案:

答案 0 :(得分:5)

您没有致电aa.mean。将函数调用括号放在最后,实际调用它,速度差几乎消失。 (np.mean(aa)aa.mean()都是NumPy;都不使用Python内置来进行数学计算。)

答案 1 :(得分:5)

其他人已经指出你的比较并不是真正的比较(你没有调用函数+两者都是numpy)。
但是要回答问题“numpy函数是否缓慢?”:一般来说,不,numpy函数不慢(或者不比普通的python函数慢)。当然,还有一些附注:

  • '慢'取决于你的比较,它总是更快。对于cythonnumexprnumba,调用C代码,......等其他内容,在许多情况下,肯定可以获得更快的结果。
  • Numpy有一定的开销,在某些情况下可能很重要。例如,正如您已经提到的,numpy在小数组和标量数学上可能会变慢。有关此问题的比较,请参阅例如Are NumPy's math functions faster than Python's?

进行您想要进行的比较:

In [1]: import numpy as np
In [2]: aa = np.arange(1000000)
In [3]: bb = range(1000000)

对于mean(注意,python标准库中没有平均函数:Calculating arithmetic mean (average) in Python):

In [4]: %timeit np.mean(aa)
100 loops, best of 3: 2.07 ms per loop

In [5]: %timeit float(sum(bb))/len(bb)
10 loops, best of 3: 69.5 ms per loop

对于max,numpy vs plain python:

In [6]: %timeit np.max(aa)
1000 loops, best of 3: 1.52 ms per loop

In [7]: %timeit max(bb)
10 loops, best of 3: 31.2 ms per loop

作为最后一点,在上面的比较中,我为numpy函数使用了numpy数组(aa),为普通python函数使用了一个列表(bb)。如果你使用带有numpy函数的列表,在这种情况下它会再次变慢:

In [10]: %timeit np.max(bb)
10 loops, best of 3: 115 ms per loop

因为列表首先转换为数组(大部分时间消耗)。因此,如果你想在你的应用程序中依赖numpy,那么使用numpy数组来存储数据是很重要的(或者如果你有一个列表,将它转换为一个数组,这样这个转换只需要进行一次)。