我最近收到了有关优化代码的帮助,以便在运行需要检查许多排列的代码时使用生成器来节省内存。从透视角度来看,我相信生成器正在迭代一个列表 2! * 2! * 4! * 2! * 2! * 8! * 4! * 10!其中的元素。不幸的是,虽然我现在不再耗尽内存产生排列,但运行我的代码需要大约24小时。是否可以通过GPU并行化这个?
使用上述所有排列生成迭代器只需要大约1秒钟,它会尝试遍历列表,从而减慢它的速度。
代码试图做的是找到最小化特定功能的排列(稳定婚姻的变化)。
每个排列都是特定顺序的名称列表。有一个单独的主要工作列表。列表中的每个名称都按优先顺序对这些作业进行排名。该算法将遍历列表中的每个名称,并且如果它们之前没有被任何人占用,则将它们列为排名最高的作业。目标是最小化列表中候选人的平均选择排名(也就是每个人最佳地获得他们的首选职位)。我的代码目前在O(n ^ 2)时间内运行。我不确定它是否可以更好地进行优化,但理想情况下我希望代码在<24小时内完成并在GPU上并行化可能是最佳选择。
这是生成排列的代码。 T = ~2秒。在生成它们之后,它运行min函数以找到最佳结果(具有最低平均候选排名的排列)。
groups = itertools.groupby(data,operator.itemgetter(1))
permutations = map(itertools.permutations, map(operator.itemgetter(1), groups))
results = map(list, map(itertools.chain.from_iterable, itertools.product(*permutations)))
best = min(results, key=gen_ranking_score)
def gen_ranking_score(choice_order):
#there are 40 roles to choose from
roles_temp = list(range(1,41))
candidate_assignment = {}
candidate_role_assignment = {}
for candidate in choice_order:
candidate = candidate[0]
#candidate_rankings is a dict initialized in beginning that has the job preferences in order for each candidate.
#iterates sequentially through the candidate's rankings. If the job is available, assign it to the candidate and remove it from the list of available jobs.
for rank_index in range(1,len(candidate_rankings[candidate])):
if (candidate_rankings[candidate][rank_index] in roles_temp):
candidate_assignment[candidate] = rank_index+1
roles_temp.remove(candidate_rankings[candidate][rank_index])
break
return (statistics.mean(candidate_assignment.values()))
我觉得我可以接受这个代码,并将分配分配到多个核心,GPU是最佳选择。这可能用Python吗?