我有一个方法,它采用嵌套dict input_dict
final = 0
for key, value in input_dict[self.state][self.city].iteritems():
age = self._get_age(key)
if (age > 0 and age < MAX_VAL):
final += value * self.lookup[key][age] * self.multiplier
return final
它的运行时间约为.03秒,但在一个示例执行中,它被调用了>;10k次,最后成为瓶颈,并负责大约50%的运行时间。假设我不能减少调用该方法的总次数,是否有人对如何改进该方法提出了建议?你知道吗
built-in ^{} function 通常比写出
for
循环快。(参见this question)在您的例子中,您可以构造一个generator expression的要求和的值,然后将其传递给sum
:或许可以考虑以下情况-
在这里,我将
self.multiplier
的乘法从循环中拉出来,并将比较0 < age < MAX_VALUE
替换为预计算值的等效比较,通过使用注释中描述的_get_age()
方法替换key
获得。这允许我们跳过函数调用+额外的计算,对于age <= 0 or age >= MAX_VALUE
的情况,与原始if0 < age < MAX_VALUE
相比,不会产生额外的成本(除了计算循环外的2个变量)。此外,这允许我们使用内置的sum()
函数,它通常比通过for循环求和更快,但是没有像qxz的答案那样创建单独的生成器。你知道吗请注意,我假设
_get_age()
方法中的(self.current_period - period)
是一个整数,因此/ 7
将结果放在Python-2.x中。如果不是这样,请从current_period
赋值中删除- (self.current_period % 7)
以获得等效功能。你知道吗相关问题 更多 >
编程相关推荐