Возможно, рассмотрим что-то вроде следующего:
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
эквивалентным сравнением предварительно вычисленных значений, полученныхзамена age
на ваш _get_age()
метод, описанный в комментариях, и решение для key
.Это позволяет нам пропустить вызов функции + дополнительные вычисления для случаев, когда age <= 0 or age >= MAX_VALUE
, и не требует дополнительных затрат (за исключением вычисления 2 переменных вне цикла) по сравнению с оригиналом, если 0 < age < MAX_VALUE
.Кроме того, это позволяет нам использовать встроенную функцию sum()
, которая обычно быстрее, чем суммирование через цикл for, но без создания отдельного генератора, как в ответе qxz.
Обратите внимание, что я предполагаю (self.current_period - period)
в вашем _get_age()
методе является целое число, поэтому / 7
выводит результат в Python-2.x.Если это не так, удалите - (self.current_period % 7)
из назначения current_period
для эквивалентной функциональности.