【发布时间】:2013-10-07 19:26:49
【问题描述】:
为什么Python这行
yy = [sum(y[i:i+5])/5. for i in range(len(y)-4)]
运行速度比以下(等效)代码快 20 倍?
for i in xrange(0,len(y)-4):
yy = np.append(yy, sum(y[i:i+5])/5.)
其中 y 是一个大实数数组。 这里到底发生了什么? 非常感谢。
【问题讨论】:
-
您仍然可以在第一个示例中使用 xrange,可能会加快速度。
-
列表推导往往比循环更快。见stackoverflow.com/questions/2849645/…
-
你说这些是等价的是什么意思?在查看 NumPy 的
append时,它调用 NumPy 的concatenate,它至少会额外检查掩码数组。此外,附加到数组通常更昂贵,所以我不确定这个结果是否违反直觉。 -
将
numpy添加到标签中,这与numpy 的关系与python 的关系一样多。 -
@EMS 额外的检查不会增加太多开销。问题是使用
numpy.append使算法O(n^2),而pythonlists 在执行appends 的序列时具有O(n)性能。