【发布时间】:2015-01-28 13:27:11
【问题描述】:
这是一个关于在字典理解内的列表理解上使用 set() 与字典理解和重复分配给新字典的性能的问题
所以我碰巧有一个数据集,它是一个列表列表,我需要在大列表中的每个列表中获取索引为“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
【问题讨论】:
-
生成大量随机数据并使用它并重新计时... 2 最终会更快出来,因为它做的工作更少(例如:不是建立一个列表,然后建立一个集合)
-
时间上的差异等于在#1 中产生额外的
set所花费的时间......在百万元素列表上只有几毫秒。换句话说,在别处寻找瓶颈。 -
您不能在此处使用
dict.fromkeys,因为dict.fromkeys(..., [])将共享列表,这可能是您不想要的 -
@thefourtheye 我同意。我没有。提到它只是为了让我了解我在这里想要实现的目标..
-
更快的是使用 set-comp
{ x: [] for x in {i[0] for i in data}}... - 这意味着dicts 替换重复键是瓶颈
标签: python python-2.7 set list-comprehension dictionary-comprehension