减少函数调用

2024-05-16 07:50:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我分析了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

其中setOfPeopleperson对象的列表。我尝试了以下方法:

^{pr2}$

但是,这给了我一个错误,说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))

返回自我效用[车]

编辑:征求新想法

有什么办法让这个速度进一步加快吗。我用亚历克斯建议的方法把时间缩短了一半。我能再快点吗? 谢谢。在


Tags: 方法self算法count时间math速度utility
3条回答

方法只是绑定到对象的函数:

    Utility = Person.getUtility
    for person in setOfPeople:
       if Utility(person, theCar) ...

但这并不能消除函数调用,它消除了属性查找。在

我怀疑,在这种情况下,通过提升person.getUtility的查找(按类,而不是按实例,正如其他实例所指出的那样)可以获得很大的加速。也许…:

return sum(1 for p in setOfPeople
           if p.periodCarPurchased is None
           and p.getUtility(theCar) >= price)

但我怀疑大部分时间实际上都花在了getUtility的执行上(如果这是一个与普通的旧属性相反的奇特属性,那么可能是在查找{}时——我将后者移到了and之前,以防它是一个普通属性,可以节省许多getUtility调用)。在这个函数(它调用其他函数的净时间)与所讨论的方法(可能还有属性)之间,你的分析说明了什么?在

尝试一下(假设所有人都属于同一类型Person):

Utility = Person.getUtility
for person in setOfPeople:
    if Utility (person, theCar) >= ...

另外,使用is None代替== None应该稍微快一点。试试交换and术语是否有帮助。在

相关问题 更多 >