优化字典循环求和值

2024-04-19 03:53:50 发布

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

我有一个方法,它采用嵌套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%的运行时间。假设我不能减少调用该方法的总次数,是否有人对如何改进该方法提出了建议?你知道吗


Tags: 方法keyinselfcityforinputage
2条回答

built-in ^{} function通常比写出for循环快。(参见this question)在您的例子中,您可以构造一个generator expression的要求和的值,然后将其传递给sum

items = (
    (key,value,self._get_age(key))
    for key,value in input_dict[self.state][self.city].iteritems()
)
return sum(
    value * self.lookup[key][age] * self.multiplier
    for key,value,age in items
    if 0 < age < MAX_VAL
)

或许可以考虑以下情况-

current_period = self.current_period - (self.current_period % 7)
MIN_VALUE = current_period - 7 * MAX_VALUE
return self.multiplier * sum(value * self.lookup[key][self._get_age(key)]
    for key, value in input_dict[self.state][self.city].iteritems()
    if MIN_VALUE < key < current_period
)

在这里,我将self.multiplier的乘法从循环中拉出来,并将比较0 < age < MAX_VALUE替换为预计算值的等效比较,通过使用注释中描述的_get_age()方法替换key获得。这允许我们跳过函数调用+额外的计算,对于age <= 0 or age >= MAX_VALUE的情况,与原始if 0 < age < MAX_VALUE相比,不会产生额外的成本(除了计算循环外的2个变量)。此外,这允许我们使用内置的sum()函数,它通常比通过for循环求和更快,但是没有像qxz的答案那样创建单独的生成器。你知道吗

请注意,我假设_get_age()方法中的(self.current_period - period)是一个整数,因此/ 7将结果放在Python-2.x中。如果不是这样,请从current_period赋值中删除- (self.current_period % 7)以获得等效功能。你知道吗

相关问题 更多 >