Numpy 应该很快。但是,当将 Numpy ufunc 与标准 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
请您参考如下方法:
其他人已经指出你的比较不是真正的比较(你没有调用函数+都是numpy)。
但是要回答“numpy 函数慢吗?” 这个问题:一般来说,不,numpy 函数并不慢(或者不比普通 python 函数慢)。当然还有一些注意事项:
- “慢”当然取决于你比较的对象,它总是可以更快。像 cython 这样的东西, numexpr , numba ,调用 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 标准库中没有 mean 函数: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 与纯 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 数组来存储你的数据是很重要的(或者如果你有一个列表,将它转换为一个数组,这样这个转换只需要完成一次)。
