Делает ли локальные псевдонимы переменных ускорять списки, поскольку он делает петли?

Имена имен относительно дороги в Python, поэтому для больших циклов вы можете получить преимущество в производительности, изменив что-то вроде

for element in my_list: do_something(element) 

к чему-то вроде

 ds = do_something for element in my_list: ds(element) 

так что интерпретатору нужно искать локальную переменную на каждой итерации. Эта оптимизация также полезна, если функция вызывается пониманием списка?

One Solution collect form web for “Делает ли локальные псевдонимы переменных ускорять списки, поскольку он делает петли?”

Да. Я установил простой пример, используя timeit :

 from __future__ import print_function import timeit setup = ''' def return_five(): return 6 def f1(): return [return_five() for i in range(10000)] def f2(): r = return_five return [r() for i in range(10000)] ''' print('Not a local variable:') print(min(timeit.Timer('a = f1()', setup=setup).repeat(7, 1000))) print('Local variable:') print(min(timeit.Timer('a = f2()', setup=setup).repeat(7, 1000))) 

Типичным результатом этого сценария было

 Not a local variable: 1.22310686111 Local variable: 1.17974805832 

Я был удивлен, увидев, что вторая функция f2 была примерно на 3,5% быстрее первой. Я ожидал, что Python будет только искать return_five один раз, когда он столкнулся с пониманием списка в f1 , но, похоже, каждый раз он просматривает его.

(Предположительно, это так, что понимание списка ведет себя правильно, если одна из задействованных функций имеет побочный эффект от изменения поиска имени каким-то образом. Это кажется довольно патологическим побочным эффектом для меня, но я думаю, что лучше быть немного неэффективным, чем ввести оптимизацию, которая может привести к ошибкам, затрудняющим отслеживание.)

Когда я изменил размер списков с 10 000 до 10, пробел закрылся, так что f2 был только на 0,8% быстрее, чем f1 . Это подтверждает, что поиск имени функции выполняется на каждой итерации через цикл.

  • python 2 vs python 3 производительность случайных, особенно `random.sample` и` random.shuffle`
  • Как получить n_estimator и max_features минимальной ошибки OOB и использовать их для оптимизации?
  • python numpy: итерация для разных условий без использования цикла
  • Оптимизация кода Python
  • Сравнение нескольких файлов csv и поиск совпадений
  • Как использовать функцию минимизации в scipy с ограничениями
  • scipy не оптимизирует и возвращает «Желаемая ошибка не всегда достигается из-за потери точности»
  • Эквивалентность Python для встроенных функций или макросов
  • Python - лучший язык программирования в мире.