Там в C++ сравнения, чтобы получить объединение списков из списков списков: The fastest way to find union of setsбыстрый способ получить объединение списков - Python
И есть несколько других вопросов, связанных с питона, но ни один не предложить самый быстрый способ объединять списки:
Из ответов, я понял, что Ther е, по крайней мере 2 способа сделать это:
>>> from itertools import chain
>>> x = [[1,2,3], [3,4,5], [1,7,8]]
>>> list(set().union(*x))
[1, 2, 3, 4, 5, 7, 8]
>>> list(set(chain(*x)))
[1, 2, 3, 4, 5, 7, 8]
Обратите внимание, что я произнесения набор перечислить потом, потому что мне нужен порядок списка должны быть установлены для дальнейшей обработки.
После некоторого сравнения, похоже list(set(chain(*x)))
является более стабильным и занимает меньше времени:
from itertools import chain
import time
import random
# Dry run.
x = [[random.choice(range(10000))
for i in range(10)] for j in range(10)]
list(set().union(*x))
list(set(chain(*x)))
y_time = 0
z_time = 0
for _ in range(1000):
x = [[random.choice(range(10000))
for i in range(10)] for j in range(10)]
start = time.time()
y = list(set().union(*x))
y_time += time.time() - start
#print 'list(set().union(*x)):\t', y_time
start = time.time()
z = list(set(chain(*x)))
z_time += time.time() - start
#print 'list(set(chain(*x))):\t', z_time
assert sorted(y) == sorted(z)
#print
print y_time/1000.
print z_time/1000.
[выход]:
1.39586925507e-05
1.09834671021e-05
Вынув переменный заброс наборов в список:
y_time = 0
z_time = 0
for _ in range(1000):
x = [[random.choice(range(10000))
for i in range(10)] for j in range(10)]
start = time.time()
y = set().union(*x)
y_time += time.time() - start
start = time.time()
z = set(chain(*x))
z_time += time.time() - start
assert sorted(y) == sorted(z)
print y_time/1000.
print z_time/1000.
[out]:
1.22241973877e-05
1.02684497833e-05
Вот полный выход, когда я пытаюсь напечатать промежуточные моменты времени (без списка литья): http://pastebin.com/raw/y3i6dXZ8
Почему list(set(chain(*x)))
занимает меньше времени, чем list(set().union(*x))
?
Есть ли другой способ достижения такого же объединения списков? Использование numpy
или pandas
или sframe
или что-то в этом роде?Является ли альтернатива быстрее?
являются внутренние списки сортируются? – fl00r
Нет, внутренние списки явно не сортируются. Предполагается, что порядок ввода списка списков неизвестен. – alvas