python - numpy.sum 可能比 Python for 循环慢

标签 python performance numpy vectorization

当在特定轴上对数组求和时,专用数组方法 array.sum(ax) 实际上可能比 for 循环慢:

v = np.random.rand(3,1e4)

timeit v.sum(0)                             # vectorized method
1000 loops, best of 3: 183 us per loop

timeit for row in v[1:]: v[0] += row        # python loop
10000 loops, best of 3: 39.3 us per loop

矢量化方法比普通的 for 循环慢 4 倍以上! (wr)on(g) 这里发生了什么,我不能相信 numpy 中的向量化方法比 for 循环更快吗?

最佳答案

不,你不能。正如您有趣的示例指出的那样,numpy.sum 可能不是最优的,并且通过显式 for 循环更好地布局操作可以更有效。

再举一个例子:

>>> N, M = 10**4, 10**4
>>> v = np.random.randn(N,M)
>>> r = np.empty(M)
>>> timeit.timeit('v.sum(axis=0, out=r)', 'from __main__ import v,r', number=1)
1.2837879657745361
>>> r = np.empty(N)
>>> timeit.timeit('v.sum(axis=1, out=r)', 'from __main__ import v,r', number=1)
0.09213519096374512

在这里你可以清楚地看到 numpy.sum 如果在快速运行的索引上求和(v 是 C-连续的)是最优的,而在慢速运行的轴上求和时不是最优的.有趣的是,for 循环的相反模式是正确的:

>>> r = np.zeros(M)
>>> timeit.timeit('for row in v[:]: r += row', 'from __main__ import v,r', number=1)
0.11945700645446777
>>> r = np.zeros(N)
>>> timeit.timeit('for row in v.T[:]: r += row', 'from __main__ import v,r', number=1)
1.2647287845611572

我没有时间检查 numpy 代码,但我怀疑造成差异的是连续内存访问还是跨步访问。

正如这个例子所示,在实现数值算法时,正确的内存布局非常重要。矢量化代码不一定能解决所有问题。

关于python - numpy.sum 可能比 Python for 循环慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14566564/

相关文章:

python - 导入 CSV 文件并附加到数组

python - 关于 AttributeError : module 'scipy.misc' has no attribute 'imread'

python - 如何访问 Mako 模板和 Pyramid 中的 session 变量?

python - 为什么 PyCharm 不建议为 Django 模型自动填充?

python - 使用 Python 的文本文件生成器

c++ - 为什么通过 weak_ptr 调用这么慢?

python - Numpy 拆分多维数组

python - Django - 找不到要重新加载的源

css - google page speed up-优化css传递

android - 适用于 Android 的纯 C++ 应用程序及其性能