Python 如何测量生成器序列的长度(列出comp与生成器表达式)

Python 如何测量生成器序列的长度(列出comp与生成器表达式),python,python-2.7,generator,list-comprehension,sequences,Python,Python 2.7,Generator,List Comprehension,Sequences,我有一个生成有限序列的生成器。断定 这个序列的长度我尝试了以下两种方法: seq_len = sum([1 for _ in euler14_seq(sv)]) # list comp 及 sv是序列的恒定起始值 我原以为列表理解会比较慢,而且 生成器表达式速度更快,但结果却是相反的 我认为第一个将是更多的内存密集型,因为它 首先在内存中创建一个完整的列表,这也是我认为它会慢一些的部分原因 我的问题:这一观察结果可以概括吗?这是因为 第二个语句与第一个语句中涉及两个生成器 我看过这些,还有

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

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

sv
是序列的恒定起始值

我原以为列表理解会比较慢,而且 生成器表达式速度更快,但结果却是相反的

我认为第一个将是更多的内存密集型,因为它 首先在内存中创建一个完整的列表,这也是我认为它会慢一些的部分原因

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

我看过这些,还有 看到了其他一些测量序列长度的方法,但我特别好奇列表comp和生成器表达式的比较

PS:当我决定基于一个 昨天就这样被问到的问题

(顺便问一下,对于在 不需要变量值的位置)


这是在Windows 7 64位下使用Python 2.7.2(32位)完成的。以下代码块应生成长度:

>>> gen1 = (x for x in range(10))
>>> len(list(gen1))
10

在这台计算机上,生成器表达式的速度在100000到1000000之间

$ 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

使用“u”是不需要的VAR的标准-这是常见和公认的做法-但恐怕其余的我帮不了你。设置发电机还有相当多的工作要做。一旦序列足够长,生成器表达式应该是快速的,关于
len(list(euler14_seq(sv))
?此外,如果您正在这样测试性能,您应该说明您正在测试的平台。特别是Python版本和操作系统,以及可能的硬件信息。我认为,简而言之,生成器引入了
\uuu调用\uuu
开销(在Python中可能会很慢),而listcomp没有,但这是一种直觉,我无法用引用来备份。。。。。。此外,listcomp的语句更为优化,因为执行的代码是静态的,而生成器可以在willI中四处冒泡并追求其他东西。为了保持比较的真实性,我不想混淆
len()
vs
sum()
。我问题的基本要点是弄清楚“列表comp”是否总比“生成器表达式”快。@Levon看一下这个:谢谢。。我会仔细看一看(只是快速浏览一下)我把
sv
的值提高到100000000,但list comp的速度更快(25 us/循环vs 30 us/循环)…@Levon,我认为LC的主要影响是内存分配。你的比我的快多了。对于繁忙的web服务器来说,权衡可能会变得很棘手,因为将这些临时列表存储在宝贵的RAM中可能比GeneratorShaps使用的额外周期更昂贵,我确实有很多可用的RAM。你在评论中为生成器重新设置的观点也是很好的。还是有点莫名其妙。我还得再玩玩这个。谢谢
$ 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