python - 用列表列表中的第一个元素制作字典

标签 python python-2.7 set list-comprehension dictionary-comprehension

这是一个关于使用 set() on list comprehension inside dictionary comprehension 与 dictionary comprehension 和 repeated assignment to a new dictionary 的性能问题

所以我碰巧有一个数据集,它是一个列表列表,我需要获得一个唯一的元素列表,这些元素在大列表中的每个列表中都以“0”索引,以便能够他们的新字典.. 类似于 dict.fromkeys() .. 这里我需要提供唯一键的列表..

我在用

[1] { x : [] for x in set([i[0] for i in data])}

还使用了

[2] { i[0] : [] for i in data}

此处供引用的示例数据可能如下所示: [[1,3,4], [3,5,2], [1,5,2]]

上面运行 [1] 和 [2] 的结果将是: { 1:[], 3: [] }

我在两个语句上都尝试了 %timeit 并且都给出了几乎相同的结果,这使得很难确定哪个是最好的,性能明智的,对于列表的大列表

我如何确定这里的潜在瓶颈?

编辑:

如果这有助于解释结果..

In [172]: data_new = data * 10000

In [173]: %timeit { i[0] : [] for i in data_new}
10 loops, best of 3: 160 ms per loop

In [174]: %timeit { x : [] for x in set([i[0] for i in data_new])}
10 loops, best of 3: 131 ms per loop

In [175]: data_new = data * 100000

In [176]: %timeit { x : [] for x in set([i[0] for i in data_new])}
1 loops, best of 3: 1.37 s per loop

In [177]: %timeit { i[0] : [] for i in data_new}
1 loops, best of 3: 1.58 s per loop

In [178]: data_new = data * 1000000

In [179]: %timeit { i[0] : [] for i in data_new}
1 loops, best of 3: 15.8 s per loop

In [180]: %timeit { x : [] for x in set([i[0] for i in data_new])}
1 loops, best of 3: 13.6 s per loop

最佳答案

建立一个更大的数据集,然后计时:

代码:

import random
data = [ [random.randint(1, 9) for _ in range(3)] for _ in range(1000000)]

时间:

%timeit { x : [] for x in set([i[0] for i in data])}
# 10 loops, best of 3: 94.6 ms per loop
%timeit { i[0] : [] for i in data}
# 10 loops, best of 3: 106 ms per loop
%timeit { x: [] for x in set(i[0] for i in data)}
# 10 loops, best of 3: 114 ms per loop
%timeit { x: [] for x in {i[0] for i in data}}
# 10 loops, best of 3: 77.7 ms per loop

理由:

首先限制可用键空间意味着字典只需将(给定上面的 randint)9 个唯一键分配给 9 个新列表。当使用 dict comp 时,字典必须重复创建并将其键的值重新分配给新创建的列表...不同之处在于释放空列表(垃圾)的开销收集)以及创建空列表所花费的时间。

根据 randint 的均匀分布,在 1,000,000 个元素的集合中,有 9 个唯一值的 111,111 次空列表分配和取消分配 - 这比仅仅 9 个要多得多。

关于python - 用列表列表中的第一个元素制作字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28193461/

相关文章:

java - Java 中集合的并集和交集计算错误

python - 在 Python 多处理中将 Pool.map 与共享内存数组结合起来

python - 使用 Seaborn 中的值标记水平条形图

python-2.7 - 使用 POST api 将多条记录插入 BigQuery

javascript - 如何在 mongodb 控制台中使用 set(data structure)?

c++ - vector的vector的无序集合如何写,即unordered_set<vector<vector<int>> set?

python - 搜索列表中的项目

python - Flask 在初始化期间无法运行和停止

python - 如何使用 tweepy 获取关注者数量

添加 # -*- 编码 : utf-8 -*- 后出现 python 语法错误