python 设置理解为 2.6
python set comprehension for 2.6
我正在尝试 2.6 的集合理解,并遇到了以下两种方式。我认为第一种方法会比第二种方法更快,timeit
另有建议。为什么第二种方法更快,即使第二种方法有一个额外的列表实例化,然后是一个集合实例化?
方法一:
In [16]: %timeit set(node[0] for node in pwnodes if node[1].get('pm'))
1000000 loops, best of 3: 568 ns per loop
方法二:
In [17]: %timeit set([node[0] for node in pwnodes if node[1].get('pm')])
1000000 loops, best of 3: 469 ns per loop
其中 pwnodes = [('e1', dict(pm=1, wired=1)), ('e2', dict(pm=1, wired=1))]
.
我的猜测是因为第二个涉及发电机而第一个不涉及。如果等效列表适合内存,生成器通常比等效列表慢。
In [4]: timeit for i in [i for i in range(1000)]: pass
10000 loops, best of 3: 47.2 µs per loop
In [5]: timeit for i in (i for i in range(1000)): pass
10000 loops, best of 3: 57.8 µs per loop
使用列表理解时迭代速度更快:
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
其中deque
用于说明迭代速度;将 maxlen
设置为 0
的 deque
丢弃从 iterable 中获取的所有元素,因此没有内存分配差异来扭曲结果。
这是因为在 Python 2 中,列表推导式不使用单独的命名空间,而生成器表达式则使用(它必须,必须)。这个额外的命名空间需要堆栈上的新框架,而这是昂贵的。生成器表达式的主要优点是它们 低内存占用 ,而不是它们的速度。
在Python3中,列表推导也有独立的命名空间,列表推导和生成器迭代速度相当。你也有集合理解,即使在 Python 2.
上也是最快的
我正在尝试 2.6 的集合理解,并遇到了以下两种方式。我认为第一种方法会比第二种方法更快,timeit
另有建议。为什么第二种方法更快,即使第二种方法有一个额外的列表实例化,然后是一个集合实例化?
方法一:
In [16]: %timeit set(node[0] for node in pwnodes if node[1].get('pm'))
1000000 loops, best of 3: 568 ns per loop
方法二:
In [17]: %timeit set([node[0] for node in pwnodes if node[1].get('pm')])
1000000 loops, best of 3: 469 ns per loop
其中 pwnodes = [('e1', dict(pm=1, wired=1)), ('e2', dict(pm=1, wired=1))]
.
我的猜测是因为第二个涉及发电机而第一个不涉及。如果等效列表适合内存,生成器通常比等效列表慢。
In [4]: timeit for i in [i for i in range(1000)]: pass
10000 loops, best of 3: 47.2 µs per loop
In [5]: timeit for i in (i for i in range(1000)): pass
10000 loops, best of 3: 57.8 µs per loop
使用列表理解时迭代速度更快:
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
其中deque
用于说明迭代速度;将 maxlen
设置为 0
的 deque
丢弃从 iterable 中获取的所有元素,因此没有内存分配差异来扭曲结果。
这是因为在 Python 2 中,列表推导式不使用单独的命名空间,而生成器表达式则使用(它必须,必须)。这个额外的命名空间需要堆栈上的新框架,而这是昂贵的。生成器表达式的主要优点是它们 低内存占用 ,而不是它们的速度。
在Python3中,列表推导也有独立的命名空间,列表推导和生成器迭代速度相当。你也有集合理解,即使在 Python 2.
上也是最快的