有一個C++相比,從列表的列表獲取列表的工會:The fastest way to find union of sets的最快方法 - Python的
而且還有其他幾個蟒蛇相關的問題,但沒有提出建立工會的名單最快的方法:
從答案,我收集了該療法e爲至少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