python - 加快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))
非常感谢帮助。布雷埃里克
解决方案
您正在将 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 循环中将其转换回列表。由于一个集合是无序的,它不会给出不想要的结果吗?
对不起,伙计们,我没有足够的声誉来发表评论。
推荐阅读
- angular - 如何根据我们在角度中单击的按钮更改 ngb Accordion 的 activeIds
- perl - 对于我正在 ping 的某些域,超时在 Perl 脚本中不起作用
- python - Spacy 不一致地划分句子
- java - 在测试期间将特定值插入到类构造函数中
- node.js - ECS 任务注销
- elixir - 通过列表项之一加入列表列表
- c# - 从法线向量c#中找到圆
- c# - 我如何等待 AssetBundle.LoadAssetAsync?
- google-sheets - 如何解决使用混合数据列的查询?(谷歌表)
- azure-devops - Azure DevOps - 如何允许生成代理运行一组有限的任务