2.6的python set comprehension

Ana*_*dan 7 python set set-comprehension

我正在尝试2.6的集合理解,并遇到了以下两种方式.我认为第一种方法比第二种方法更快,timeit否则建议.为什么第二种方法更快,即使第二种方法有一个额外的列表实例化后跟一组实例化?

方法1:

In [16]: %timeit set(node[0] for node in pwnodes if node[1].get('pm'))
1000000 loops, best of 3: 568 ns per loop
Run Code Online (Sandbox Code Playgroud)

方法2:

In [17]: %timeit set([node[0] for node in pwnodes if node[1].get('pm')]) 
1000000 loops, best of 3: 469 ns per loop
Run Code Online (Sandbox Code Playgroud)

哪里pwnodes = [('e1', dict(pm=1, wired=1)), ('e2', dict(pm=1, wired=1))].

Mar*_*ers 6

使用列表解析时迭代速度更快:

In [23]: from collections import deque

In [24]: %timeit deque((node[0] for node in pwnodes if node[1].get('pm')), maxlen=0)
1000 loops, best of 3: 305 µs per loop

In [25]: %timeit deque([node[0] for node in pwnodes if node[1].get('pm')], maxlen=0)
1000 loops, best of 3: 246 µs per loop
Run Code Online (Sandbox Code Playgroud)

deque用于说明迭代速度; 一个dequemaxlen设置为0丢弃该可迭代所以没有存储器分配差异歪斜的结果所采取的所有元素.

这是因为在Python 2中,列表推导不使用单独的命名空间,而生成器表达式则(必须时).额外的命名空间需要堆栈上的新帧,这是昂贵的.生成器表达式的主要优点是内存占用少,而不是速度.

在Python 3中,列表推导也有一个单独的命名空间,列表推导和生成器迭代速度是可比的.你也有设置理解,即使在Python 2上也是最快的.

  • @Anandan:你没有; 你使用列表推导或生成器表达式和`set()`callable就像你一样.如果内存不是问题而是速度,请使用列表推导. (3认同)