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

Lev*_*von 2 python sequences list-comprehension generator python-2.7

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

 seq_len = sum([1 for _ in euler14_seq(sv)])  # list comp
Run Code Online (Sandbox Code Playgroud)

 seq_len = sum(1 for _ in euler14_seq(sv))    # generator expression
Run Code Online (Sandbox Code Playgroud)

sv 是序列的常量起始值.

我原本以为列表理解会慢一点,生成器表达式会更快,但事实证明相反.

我假设第一个会占用更多的内存,因为它首先在内存中创建一个完整的列表 - 部分原因我还认为它会更慢.

我的问题:这种观察是否可以推广?这是因为第二个声明与第一个声明中涉及两个发生器吗?

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

PS:当我决定根据昨天提出的问题解决欧拉项目#14时出现了这个问题.

(顺便说一句,关于使用'_'不需要变量值的地方的一般感觉是什么).

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

Joh*_*ooy 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
Run Code Online (Sandbox Code Playgroud)