Python Numpy功能是否很慢?

Python Numpy功能是否很慢?,python,performance,function,numpy,performance-testing,Python,Performance,Function,Numpy,Performance Testing,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应该很快。然而,当比较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并不小:它有一百万个元素。我错过什么了吗

当然,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

你没有打电话给aa。意思是说。将函数调用括号放在末尾,以实际调用它,速度差将几乎消失。(
np.mean(aa)
aa.mean()
都是NumPy;都不使用Python内置函数进行计算。)

您没有调用
aa.mean
。将函数调用括号放在末尾,以实际调用它,速度差将几乎消失。(
np.mean(aa)
aa.mean()
都是NumPy;两者都不使用Python内置函数进行计算。)

其他人已经指出,您的比较不是真正的比较(您没有调用函数+两者都是NumPy)。
但是要回答“numpy函数慢吗?”:一般来说,不,numpy函数不慢(或者不慢于普通python函数)。当然,还有一些需要注意的地方:

  • “慢”取决于你与之相比的东西,它总是可以更快。例如,调用C代码。。。在许多情况下,也有可能获得更快的结果
  • Numpy有一定的开销,在某些情况下这可能非常重要。例如,正如您已经提到的,numpy在小数组和标量数学上的速度可能较慢。有关这方面的比较,请参见
要进行您想要进行的比较,请执行以下操作:

In [1]: import numpy as np
In [2]: aa = np.arange(1000000)
In [3]: bb = range(1000000)
对于
mean
(注意,python标准库中没有mean函数:):

对于
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数组存储数据(或者如果您有一个列表,请将其转换为数组,以便此转换只需执行一次)是很重要的

其他人已经指出,您的比较不是真正的比较(您没有调用函数+两者都是numpy)。
但是要回答“numpy函数慢吗?”:一般来说,不,numpy函数不慢(或者不慢于普通python函数)。当然,还有一些需要注意的地方:

  • “慢”取决于你与之相比的东西,它总是可以更快。例如,调用C代码。。。在许多情况下,也有可能获得更快的结果
  • Numpy有一定的开销,在某些情况下这可能非常重要。例如,正如您已经提到的,numpy在小数组和标量数学上的速度可能较慢。有关这方面的比较,请参见
要进行您想要进行的比较,请执行以下操作:

In [1]: import numpy as np
In [2]: aa = np.arange(1000000)
In [3]: bb = range(1000000)
对于
mean
(注意,python标准库中没有mean函数:):

对于
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数组存储数据(或者如果您有一个列表,请将其转换为数组,以便此转换只需执行一次)是很重要的

您使用的是哪个版本的Python?在Python 2中,
range()
返回一个列表。在Python3中,
range()
返回一个迭代器。这将对您的性能测量产生巨大影响。
np.mean(aa)
aa.mean
似乎是同一个函数。仅供参考,
aa.mean
没有任何作用。你不是在调用函数,你只是在给它命名。这就是为什么它这么快。瞧,你想要
aa.mean()
@DSM:True。在做了一次timeit之后,它们看起来很相似,
aa.mean()
似乎快了一点。您使用的是哪个版本的Python?在Python 2中,
range()
返回一个列表。在Python3中,
range()
返回一个迭代器。这将对您的性能测量产生巨大影响。
np.mean(aa)
aa.mean
似乎是同一个函数。仅供参考,
aa.mean
没有任何作用。你不是在调用函数,你只是在给它命名。这就是为什么它这么快。瞧,你想要
aa.mean()
@DSM:True。在做了一次timeit之后,它们似乎是相似的,
aa.mean()
似乎快了一点。