Numpy功能慢吗?

Sol*_*lma 1 python performance numpy function performance-testing

脾气暴躁应该很快。但是,将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
Run Code Online (Sandbox Code Playgroud)

使用其他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
Run Code Online (Sandbox Code Playgroud)

jor*_*ris 6

其他人已经指出,您的比较不是真正的比较(您没有调用该函数,并且两者都是numpy)。
但是要回答“ numpy函数慢吗?”这个问题:一般来说,不,numpy函数并不慢(或者不比普通python函数慢)。当然,有一些补充说明:

  • “慢”取决于您与之比较的路线,并且总是可以更快。使用cythonnumexprnumba,调用C代码等功能,在许多情况下肯定有可能获得更快的结果。
  • Numpy具有一定的开销,这在某些情况下可能非常重要。例如,正如您已经提到的,在小型数组和标量数学上,numpy的速度可能会更慢。对此进行比较,请参见例如NumPy的数学函数是否比Python的数学函数快?

要进行比较,您要进行以下操作:

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

对于mean(请注意,Python标准库中没有mean函数:在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
Run Code Online (Sandbox Code Playgroud)

对于 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
Run Code Online (Sandbox Code Playgroud)

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

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

因为列表首先被转换为一个数组(占用了大部分时间)。因此,如果您想在应用程序中依赖numpy,那么使用numpy数组存储数据非常重要(或者,如果您有列表,则将其转换为数组,因此此转换只需执行一次)。


use*_*ica 5

你不打电话aa.mean。将函数调用括号放在最后,以实际调用它,速度差将几乎消失。(np.mean(aa)aa.mean()均为NumPy;都不使用Python内置函数进行数学运算。)