有一个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