Numpy 函数慢吗?

Posted

技术标签:

【中文标题】Numpy 函数慢吗?【英文标题】:Are Numpy functions slow? 【发布时间】:2013-08-05 15:36:15 【问题描述】:

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

【问题讨论】:

您使用的是哪个版本的 Python?在 Python 2 中,range() 返回一个列表。在 Python 3 中,range() 返回一个迭代器。这将对您的绩效衡量产生巨大影响。 np.mean(aa)aa.mean 似乎是同一个函数。 仅供参考,aa.mean 不做任何事情。你没有调用函数,你只是命名它。这就是为什么它这么快。 IOW,你想要aa.mean() @DSM:是的。做了一段时间后,它们似乎很相似,aa.mean() 似乎有点快。 【参考方案1】:

你没有打电话给aa.mean。将函数调用括号放在最后,真正调用它,速度差异将几乎消失。 (np.mean(aa)aa.mean() 都是 NumPy;两者都没有使用 Python 内置函数来计算。)

【讨论】:

【参考方案2】:

其他人已经指出,您的比较不是真正的比较(您没有调用函数 + 都是 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 数组来存储数据非常重要(或者如果您有一个列表,请将其转换为数组,因此该转换只需执行一次)。

【讨论】:

以上是关于Numpy 函数慢吗?的主要内容,如果未能解决你的问题,请参考以下文章

可以找出哪些 MySQL 查询很慢吗?

一个简单的多维数组解引用会很慢吗?

Windows 上的系统调用天生就比 Linux 慢吗?

C++ 程序真的比类似的 C 程序慢吗? [关闭]

r语言vst标准化慢吗

Numpy函数(20190806)