Одна из самых недооценённых оптимизаций в Python — вынесение повторяющихся вычислений в локальные переменные.
Причина проста: доступ к локальной переменной в CPython *в 2–3 раза быстрее*, чем к глобальной или атрибуту модуля.
Особенно важно в циклах и горячих участках кода.
import math
# Медленнее: math.sqrt вызывается через глобальное пространство имён
def slow(nums):
return [math.sqrt(x) for x in nums]
# Быстрее: ссылка на функцию закэширована в локальной переменной
def fast(nums):
sqrt = math.sqrt
return [sqrt(x) for x in nums]
# Ещё пример: длину списка лучше сохранить локально
def sum_fast(nums):
total = 0
ln = len(nums) # локальная ссылка быстрее
for i in range(ln):
total += nums[i]
return total