我正在编写一个脚本,它从companies获取元素,并将它们与people的元素配对。目标是优化配对,使所有对值之和最大化(每个对的值被预先计算并存储在字典ctrPairs)中)。在
他们都是1:1配对,每个公司只有一个人,每个人只属于一个公司,公司的数量等于人数。我使用自顶向下的方法和一个记忆表(memDict)来避免重新计算已经解决的区域。在
我相信我可以极大地提高这里发生的事情的速度,但我不确定如何提高速度。我担心的区域用#slow?标记,任何建议都将不胜感激(该脚本适用于列表n<;15的输入,但对于n>;~15,它变得异常缓慢)def getMaxCTR(companies, people):
if(memDict.has_key((companies,people))):
return memDict[(companies,people)] #here's where we return the memoized version if it exists
if(not len(companies) or not len(people)):
return 0
maxCTR = None
remainingCompanies = companies[1:len(companies)] #slow?
for p in people:
remainingPeople = list(people) #slow?
remainingPeople.remove(p) #slow?
ctr = ctrPairs[(companies[0],p)] + getMaxCTR(remainingCompanies,tuple(remainingPeople)) #recurse
if(ctr > maxCTR):
maxCTR = ctr
memDict[(companies,people)] = maxCTR
return maxCTR