2.6 的 python 集理解

标签 python set set-comprehension

我正在尝试 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 [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 设置为 0deque 丢弃从 iterable 中获取的所有元素,因此没有内存分配差异来扭曲结果。

那是因为在 Python 2 中,列表推导式不使用单独的命名空间,而生成器表达式使用(它必须,必须)。这个额外的命名空间需要堆栈上的新框架,而这是昂贵的。生成器表达式的主要优点是它们低内存占用,而不是它们的速度。

在 Python 3 中,列表推导式也有一个单独的命名空间,列表推导式和生成器迭代速度相当。您还拥有集合理解,即使在 Python 2 上也是最快的。

关于2.6 的 python 集理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31271062/

相关文章:

Python - 在 for 循环中使用 frozenset 条目列表的问题

python - (集)多个值的理解

python - 具有取决于输入参数的通用理解返回类型的函数?

python - 这本字典中的 for 循环到底是如何工作的?

python - 简单的Python-3程序中的无效语法错误

java - 更新 TreeMap<String, TreeSet<String>> 的映射值

javascript - Node.JS:带有请求模块的简单 GET 抛出 "Possible EventEmitter memory leak detected"

C++ std::set::erase 与 std::remove_if

python - 在 Python Pandas Dataframe 中计算百分位数

python - 使用 Anaconda 或 Canopy 安装 Python 模块