python - 为什么 numpy.power 比 in-lining 慢 60 倍?

标签 python arrays performance numpy

也许我在做一些奇怪的事情,但在使用 numpy 时可能会发现令人惊讶的性能损失,无论使用何种功率似乎都是一致的。例如当 x 是一个随机的 100x100 数组时

x = numpy.power(x,3) 

慢大约 60 倍
x = x*x*x

各种阵列大小的加速图显示了阵列大小约为 10k 的最佳点,而其他大小的阵列则一致地加速了 5-10 倍。

enter image description here

在你自己的机器上测试下面的代码(有点乱):

import numpy as np
from matplotlib import pyplot as plt
from time import time

ratios = []
sizes = []
for n in np.logspace(1,3,20).astype(int):
    a = np.random.randn(n,n)

    inline_times = []
    for i in range(100):
        t = time()
        b = a*a*a
        inline_times.append(time()-t)
    inline_time = np.mean(inline_times)

    pow_times = []
    for i in range(100):
        t = time()
        b = np.power(a,3)
        pow_times.append(time()-t)
    pow_time = np.mean(pow_times)

    sizes.append(a.size)
    ratios.append(pow_time/inline_time)

plt.plot(sizes,ratios)
plt.title('Performance of inline vs numpy.power')
plt.ylabel('Nx speed-up using inline')
plt.xlabel('Array size')
plt.xscale('log')
plt.show()

有人解释一下吗?

最佳答案

众所周知,您的处理器可以以非常奇特的方式执行 double 的乘法,速度非常非常快。 pow 明显更慢。

Some performance guides那里甚至建议人们为此做好计划,甚至可能以某种方式有时可能有点过分热心。

numpy 特殊情况平方以确保它不会太慢,但它会立即将立方发送到您的 libc 的 pow,这几乎没有几个乘法那么快。

关于python - 为什么 numpy.power 比 in-lining 慢 60 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25254541/

相关文章:

performance - 在 R 中未命名(变为命名)时对向量的分配非常慢

python - 在spyder中启动内核时发生错误

c - 如何在不使用指针的情况下将字符串分成两半

python - 使用 Tornado httpclient 对 Github API 的简单未授权请求返回 Forbidden

python - 在 python 中解压数组

c - 什么时候在 C 中未定义指针减法?

django - 在 Django 中使用用户配置文件检索用户的最有效方法

algorithm - 表示和乘以稀疏 bool 矩阵的最快方法是什么?

python - CNTK 中以下 tensorflow 片段的等价物是什么

python - super 能够访问父类的属性