如何测量发电机序列的长度(列表补偿与发电机表达)

时间:2012-07-05 23:23:02

标签: python python-2.7 generator list-comprehension sequences

我有一个生成有限序列的生成器。确定 这个序列的长度我尝试了这两种方法:

 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 outputIs 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位)完成的

2 个答案:

答案 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