我想知道为什么列表理解比添加到列表要快得多。我以为这只是表达上的差异,但事实并非如此。
>>> import timeit
>>> timeit.timeit(stmt='''\
t = []
for i in range(10000):
t.append(i)''', number=10000)
9.467898777974142
>>> timeit.timeit(stmt='t= [i for i in range(10000)]', number=10000)
4.1138417314859
列表理解速度提高了50%。为什么?
引用this文章,是因为
list
的append
属性没有作为函数进行查找、加载和调用,这需要时间,而且在迭代过程中累积起来。列表理解基本上只是常规循环的“语法糖”。在这种情况下,它执行得更好的原因是它不需要加载列表的append属性,并在每次迭代时将其作为函数调用。换句话说,通常情况下,列表理解的执行速度更快,因为挂起和恢复函数的帧,或者在其他情况下多个函数,比按需创建列表慢。
请考虑以下示例:
您可以看到在偏移22处,第一个函数中有一个
append
属性,因为在第二个使用列表理解的函数中没有这样的属性。所有这些额外的字节码都会使附加过程变慢。还要注意的是,在每次迭代中还将加载append
属性,这使得代码比使用列表理解的第二个函数慢大约2倍。即使考虑到查找和加载
append
函数所需的时间,列表的理解速度仍然更快,因为列表是用C创建的,而不是用Python一次构建一个项。相关问题 更多 >
编程相关推荐