首先,我能够做到这一点,但我对速度不满意。
我的问题是,有没有更好、更快的方法来完成这个任务?
我有一个类似于下面的项目列表:
[(1,2), (1,2), (4,3), (7,8)]
我需要获取所有唯一的组合。例如,2个物品的唯一组合将是:
[(1,2), (1,2)], [(1,2), (4,3)], [(1,2), (7,8)], [(4,3), (7,8)]
使用itertools.combinations后,由于存在重复项,我得到的结果比期望的要多。例如,每个包含(1,2)的列表都会出现两次。如果我创建这些组合的集合,就能获得唯一的组合。
问题在于,当原始列表有80个元组,我想要其中包含6个项目的组合时,获取该集合需要超过30秒的时间。如果可以减少这个时间,我会非常高兴。
我知道组合的数量是庞大的,这就是为什么创建集合需要耗费时间的原因。但我仍然希望有一个库可以优化这个过程,以加快速度。
值得注意的是,对于所有找到的组合,我只测试前10000个左右。因为在某些情况下,所有组合可能太多而无法处理,所以我不想花费太多时间在它们上面,因为还有其他测试需要进行。
这是我现在拥有的样本:
from itertools import combinations
ls = [list of random NON-unique sets (x,y)]
# ls = [(1,2), (1,2), (4,3), (7,8)] # example
# in the second code snipped it is shown how I generate ls for testing
all_combos = combinations(ls, 6)
all_combos_set = set(all_combos)
for combo in all_combos_set:
do_some_test_on(combo)
如果您想测试它,这是我用于测试不同方法速度的内容:
def main3():
tries = 4
elements_in_combo = 6
rng = 90
data = [0]*rng
for tr in range(tries):
for n in range(1, rng):
quantity = 0
name = (0,0)
ls = []
for i in range(n):
if quantity == 0:
quantity = int(abs(gauss(0, 4)))
if quantity != 0:
quantity -= 1
name = (randint(1000,7000), randint(1000,7000))
ls.append(name)
else:
quantity -= 1
ls.append(name)
start_time = time.time()
all_combos = combinations(ls, elements_in_combo)
all_combos = set(all_combos)
duration = time.time() - start_time
data[n] += duration
print(n, "random files take", duration, "seconds.")
if duration > 30:
break
for i in range(rng):
print("average duration for", i, "is", (data[i]/tries), "seconds.")