我分析了python程序,发现下面的函数运行时间太长。也许,我可以用另一种算法,让它运行得更快。但是,我读过,我也可以通过减少函数调用来提高速度,特别是当它在循环中被反复调用时。我是一个python新手,想学习如何做到这一点,看看它能有多快。目前的功能是:
def potentialActualBuyers(setOfPeople,theCar,price):
count=0
for person in setOfPeople:
if person.getUtility(theCar) >= price and person.periodCarPurchased==None:
count += 1
return count
其中setOfPeople
是person
对象的列表。我尝试了以下方法:
但是,这给了我一个错误,说local variable 'person' referenced before assignment
有什么建议,我如何减少函数调用或任何其他可以使代码更快的更改。在
同样,我是一个python新手,尽管我可能能够使用更好的算法,但是仍然值得学习上面问题的答案。在
非常感谢。在
*****编辑*****
添加getUtility
方法:
def getUtility(self,theCar):
if theCar in self.utility.keys():
return self.utility[theCar]
else:
self.utility[theCar]=self.A*(math.pow(theCar.mpg,self.alpha))*(math.pow(theCar.hp,self.beta))*(math.pow(theCar.pc,self.gamma))
返回自我效用[车]
编辑:征求新想法
有什么办法让这个速度进一步加快吗。我用亚历克斯建议的方法把时间缩短了一半。我能再快点吗? 谢谢。在
方法只是绑定到对象的函数:
但这并不能消除函数调用,它消除了属性查找。在
我怀疑,在这种情况下,通过提升
person.getUtility
的查找(按类,而不是按实例,正如其他实例所指出的那样)可以获得很大的加速。也许…:但我怀疑大部分时间实际上都花在了}时——我将后者移到了
getUtility
的执行上(如果这是一个与普通的旧属性相反的奇特属性,那么可能是在查找{and
之前,以防它是一个普通属性,可以节省许多getUtility
调用)。在这个函数(它调用其他函数的净时间)与所讨论的方法(可能还有属性)之间,你的分析说明了什么?在尝试一下(假设所有人都属于同一类型
Person
):另外,使用
is None
代替== None
应该稍微快一点。试试交换and
术语是否有帮助。在相关问题 更多 >
编程相关推荐