列表推演 比 list 差这么多?

2016-08-05 14:38:29 +08:00
 petelin

In [115]: timeit len(list(itertools.repeat(0,10000))) 10000 loops, best of 3: 60.5 µs per loop

In [116]: timeit len([i for i in itertools.repeat(0,10000)]) 1000 loops, best of 3: 290 µs per loop

有人解释说 第二个是生成一个[]然后 append 进去的所以慢, w(゚Д゚)w ,那第一个难道不是?他能知道长度?

2088 次点击
所在节点    Python
2 条回复
yangtukun1412
2016-08-05 15:09:36 +08:00
help(itertools.repeat.__length_hint__)
necomancer
2016-08-06 09:49:44 +08:00
楼上完美解决问题。
好像是一个需要不需要推演的问题, itertools 叫高效迭代器看来不是白叫的。
速度排序:
In [4]: %timeit len([0] * 10000) #直接写出列表
10000 loops, best of 3: 25.8 µs per loop
In [5]: %timeit len(list(itertools.repeat(0,10000))) #这个有 __length_hint__
10000 loops, best of 3: 49.9 µs per loop
In [6]: %timeit len([ i for i in itertools.repeat(0, 10000) ]) # list comprehension
1000 loops, best of 3: 333 µs per loop
In [7]: %timeit len(list((x for x in itertools.repeat(0, 10000)))) # list(generator)
1000 loops, best of 3: 642 µs per loop
如果用 0 for i in range(10000) 会更慢,就不写了。
所以应该是列表推导的问题。并且 list comprehension 的速度 > list(generator)
还有更慢的比如 sum(1 for i in generator),不过内存消耗会最小。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/297369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX