我有一个生成有限序列的生成器。确定 这个序列的长度我尝试了这两种方法:
seq_len = sum([1 for _ in euler14_seq(sv)]) # list comp
和
seq_len = sum(1 for _ in euler14_seq(sv)) # generator expression
sv
是序列的常量起始值。
我原本以为列表理解会慢一些 生成器表达式更快,但事实证明相反。
我认为第一个会因为内存密集得多 首先在内存中创建一个完整的列表 - 部分原因我还认为它会更慢。
我的问题:这种观察是否可以推广?这是由于 第二个语句中涉及两个生成器与第一个语句相关吗?
我查看了这些What's the shortest way to count the number of items in a generator/iterator?,Length of generator output和 Is there any built-in way to get the length of an iterable in python?并且看到了一些测量序列长度的方法,但我对列表补偿与生成器表达式的比较特别好奇。
PS:当我决定基于a来解决Euler Project #14时,就出现了这个问题 昨天问了这个问题。
(顺便说一句,关于使用'_'
的一般感觉是什么
不需要变量值的地方。)
这是在Windows 7 64位
下使用Python 2.7.2(32位)完成的答案 0 :(得分:5)
在这台计算机上,生成器表达式在100,000到1,000,000之间变得更快
$ python -m timeit "sum(1 for x in xrange(100000))"
10 loops, best of 3: 34.8 msec per loop
$ python -m timeit "sum([1 for x in xrange(100000)])"
10 loops, best of 3: 20.8 msec per loop
$ python -m timeit "sum(1 for x in xrange(1000000))"
10 loops, best of 3: 315 msec per loop
$ python -m timeit "sum([1 for x in xrange(1000000)])"
10 loops, best of 3: 469 msec per loop
答案 1 :(得分:3)
以下代码块应生成长度:
>>> gen1 = (x for x in range(10))
>>> len(list(gen1))
10