【发布时间】:2012-12-16 23:18:39
【问题描述】:
我试图找到列表理解的效率,但它看起来比普通函数操作更昂贵。谁能解释一下?
def squares(values):
lst = []
for x in range(values):
lst.append(x*x)
return lst
def main():
t = timeit.Timer(stmt="lst = [x*x for x in range(10)]")
print t.timeit()
t = timeit.Timer(stmt="squares",setup="from __main__ import squares")
print t.timeit()
lst = [x*x for x in range(10)]
print lst
print squares(10)
----Output:---
2.4147507644
0.0284455255965
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
对于相同的输出,与列表推导相比,普通函数的计算时间非常短。
我认为列表理解更有效。
【问题讨论】:
-
下面的答案解释了你的结果 - 但值得注意的是为什么列表 comp 更快 - 循环在较低级别执行,这意味着它可以更有效地完成。
-
@Lattyware:不,循环实际上没有区别;非压缩版本中的
.append()调用加快了速度。每次都需要在循环中查找和调用它,并且每次都会为那个元素增长列表。 comp 可以一口气建立列表。