为什么追加到列表比列表理解慢得多?
列表理解因其简洁和高效而在 Python 中广受欢迎。虽然它可能显示为常规 for 循环的语法快捷方式,但它提供了显着的性能优势,尤其是在将元素附加到列表时。
基准测试差异
考虑以下代码片段:
import timeit timeit.timeit(stmt=''' t = [] for i in range(10000): t.append(i)''', number=10000) timeit.timeit(stmt='t= [i for i in range(10000)]', number=10000)
从结果中可以看出,列表理解速度明显更快,比附加方法快了大约 50%。
深入探究原因
列表理解本质上是一种语法构造,它基于现有的可迭代生成新列表。与附加方法不同,它不需要在每次迭代时检索和调用附加属性。
代码反汇编
使用反汇编器进行更深入的分析提供见解深入了解根本差异:
# Function using appending dis.dis(f1)
在使用附加的函数的反汇编代码中,每次迭代都有一个明显的 LOAD_METHOD 和 CALL_METHOD 对(字节码 18-22)。这些指令处理附加属性的加载和调用,这会产生开销。
# Function using list comprehension dis.dis(f2)
相反,列表理解版本(字节码 10-12)涉及单个 CALL_FUNCTION 指令。该指令无需属性检索即可高效构造新列表。
结论
列表理解效率的提高源于其优化的实现。通过避免重复加载和调用追加属性,列表理解可以按需创建列表,从而显着提高性能,特别是在处理大型迭代时。
以上是为什么列表推导式比 Python 中添加到列表要快得多?的详细内容。更多信息请关注PHP中文网其他相关文章!