【发布时间】:2018-08-22 21:00:36
【问题描述】:
最近有人问我iterator、list comprehension、iter(list comprehension) 和generator 中哪一个是最快的。
然后制作如下简单的代码。
n = 1000000
iter_a = iter(range(n))
list_comp_a = [i for i in range(n)]
iter_list_comp_a = iter([i for i in range(n)])
gene_a = (i for i in range(n))
import time
import numpy as np
for xs in [iter_a, list_comp_a, iter_list_comp_a, gene_a]:
start = time.time()
np.sum(xs)
end = time.time()
print((end-start)*100)
结果如下。
0.04439353942871094 # iterator
9.257078170776367 # list_comprehension
0.006318092346191406 # iterator of list_comprehension
7.491207122802734 # generator
generator 比其他东西慢。 不知道什么时候有用?
【问题讨论】:
-
这不是衡量计算时间的非常准确的方法...我建议您尝试使用
timeit。 -
@przemo_li 取决于 python 版本;
xrange在 python3 中不存在。 -
另外值得指出的是,当您进行计时时,
list_comp_a不是列表推导,它是使用列表推导创建的列表 -
适当的测试不会显示生成器的相同极端分歧:repl.it/repls/IndianredImmediateTests
-
@przemo_li 看起来您不了解 Python 中的“迭代器”、“可迭代”和“生成器”是什么,也不了解它们与惰性求值的关系。 Py2 的
range()是一个返回list的函数(它确实是可迭代的,但不是迭代器),xrange()是一个实现“可迭代”协议以在迭代期间延迟生成值但也不是生成器的类.生成器是generator类(通用可迭代类)的实例,它由生成器表达式或生成器函数(使用“yield”关键字的函数)构建。
标签: python performance generator list-comprehension