也许我在做一些奇怪的事情,但在使用 numpy 时可能会发现令人惊讶的性能损失,无论使用何种功率似乎都是一致的。例如当 x 是一个随机的 100x100 数组时
x = numpy.power(x,3)
比
慢大约 60 倍x = x*x*x
各种阵列大小的加速图显示了阵列大小约为 10k 的最佳点,而其他大小的阵列则一致地加速了 5-10 倍。
在你自己的机器上测试下面的代码(有点乱):
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/