为什么在用于压缩列表列表时,python的内置函数功能会变慢?

时间:2016-12-08 05:50:30

标签: python-2.7

当尝试使用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

有人可以向我解释为什么会这样吗?

1 个答案:

答案 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必须复制整个sarr列表以构建新的s。对于每个N大小K的列表,复制所花费的总时间与N**2 * K成正比,更糟糕。

因此,你几乎不应该使用sum来连接序列。