2

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

 seq_len = sum([1 for _ in euler14_seq(sv)])  # list comp

 seq_len = sum(1 for _ in euler14_seq(sv))    # generator expression

sv是序列的恒定起始值。

我曾预计列表理解会更慢,而生成器表达式会更快,但结果恰恰相反。

我认为第一个会占用更多的内存,因为它首先在内存中创建了一个完整的列表——我也认为它会更慢的部分原因。

我的问题:这个观察可以概括吗?这是因为第二个语句与第一个语句中涉及两个生成器吗?

我看过这些计算生成器/迭代器中项目数量的最短方法是什么?生成器输出的长度,以及 是否有任何内置方法可以在 python 中获取可迭代的长度?并看到了一些其他测量序列长度的方法,但我特别好奇 list comp 与生成器表达式的比较。

PS:当我根据昨天在 SO 上提出的问题决定解决Euler Project #14时,就出现了这个问题。

(顺便说一下,'_'在不需要变量值的地方使用 in 的一般感觉是什么)。

这是在 Windows 7 64 位下使用 Python 2.7.2(32 位)完成的

4

2 回答 2

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
于 2012-07-05T23:38:37.050 回答
3

以下代码块应生成长度:

>>> gen1 = (x for x in range(10))
>>> len(list(gen1))
10
于 2012-07-05T23:29:57.430 回答