当尝试使用python 2.7的内置sum
函数压缩列表列表时,我遇到了一些性能问题 - 不仅计算速度慢,而且迭代次数很多方法产生了更快的结果。
下面的简短代码似乎说明了这种性能差距:
import timeit
def sum1(arrs):
return sum(arrs, [])
def sum2(arrs):
s = []
for arr in arrs:
s += arr
return s
def main():
array_of_arrays = [[0] for _ in range(1000)]
print timeit.timeit(lambda: sum1(array_of_arrays), number=100)
print timeit.timeit(lambda: sum2(array_of_arrays), number=100)
if __name__=='__main__':
main()
在我的笔记本电脑上,我得到了输出:
>> 0.247241020203
>> 0.0043830871582
有人可以向我解释为什么会这样吗?
答案 0 :(得分:1)
您的sum2
使用+=
:
for arr in arrs:
s += arr
sum
不使用+=
。 sum
定义为使用+
。区别在于s += arr
允许通过变更现有的s
列表来执行操作,而s = s + arr
必须构造一个新列表,复制缓冲区旧名单。
使用+=
,Python可以使用有效的列表大小调整策略,该策略需要与最终列表的大小成比例的复制量。对于每个N
长度为K
的{{1}}列表,这需要的时间与N*K
成比例。
使用+
,Python无法做到这一点。对于每个s = s + arr
,Python必须复制整个s
和arr
列表以构建新的s
。对于每个N
大小K
的列表,复制所花费的总时间与N**2 * K
成正比,更糟糕。
因此,你几乎不应该使用sum
来连接序列。