Это вопрос о производительности использования 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
set
в #1... это несколько мс в списке из миллиона элементов. Другими словами, ищите узкое место в другом месте. - person roippi   schedule 28.01.2015dict.fromkeys
здесь, потому чтоdict.fromkeys(..., [])
будет делиться списком, что, возможно, вам не нужно. - person thefourtheye   schedule 28.01.2015set(i[0] for i in data_new)
? - person thefourtheye   schedule 28.01.2015{ x: [] for x in {i[0] for i in data}}
... - это означает, чтоdict
s заменяет повторяющиеся ключи, что является узким местом - person Jon Clements♦   schedule 28.01.2015