首页 > 解决方案 > 加快python中的for循环

问题描述

我有一个代码片段,可以为优化问题生成向量列表,但是运行需要很长时间。

这是代码:

import numpy as np
import itertools as it
import time

v=[35,36,37,38,39,40,41,42,43,44,45,46]


m=np.array(list(it.combinations_with_replacement(v,9)))
g=m[np.sum(m, axis=1)==360]
print('g shape',g.shape)

f=[]
for i,vector in enumerate(g[0:10]): #all vector is to be processed, but it takes tolong time
    print(i)
    start = time.time()
    unique_permutations = set(it.permutations(vector))
    end = time.time()
    print('length unique perm',len(unique_permutations))
    print('time perm',end-start)

    already_reviewed = []

    start= time.time()
    for p in list(unique_permutations):
        if p not in already_reviewed:       # a lot of time is spen in this check
            circular_permutations = [p[i:] + p[:i] for i in range(len(p))]
            already_reviewed.extend(circular_permutations)
            unique_permutations.difference_update(circular_permutations[1:])
    end=time.time()
    print('loop', end-start)       

    f.append(list(unique_permutations))

非常感谢帮助。布雷埃里克

标签: pythonperformancefor-loop

解决方案


您正在将 it.permutations(vector) 转换为一个集合。

unique_permutations = set(it.permutations(vector))

然后您将其转换为以下行中的列表...

for p in list(unique_permutations):

我看到您不将其用作生成器的唯一原因(这可能是您应该使用的方式)是您试图找到如下长度...

print('length unique perm',len(unique_permutations))

还有一个在这里...

unique_permutations.difference_update(circular_permutations[1:])

但这对于already_reviewed变量来说已经是多余的了,他们似乎做同样的事情,你正在执行两次检查。

因此,除了获取它的长度之外,我没有看到 unique_permutations 变量的使用(代码的 difference_update 部分是多余的),我会这样做......

unique_permutations = it.permutations(vector)
for p in unique_permutations:
    ...
...

PS:你确定你得到了想要的结果吗?因为我看到您首先将生成器转换为集合,然后转换为列表,然后对集合进行操作,然后在每个 for 循环中将其转换回列表。由于一个集合是无序的,它不会给出不想要的结果吗?

对不起,伙计们,我没有足够的声誉来发表评论。


推荐阅读