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

Имена имен относительно дороги в 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 самый быстрый способ прочитать большой текстовый файл (несколько GB)
  • Советы по оптимизации памяти для Python
  • Каков наиболее эффективный способ добавить элемент в список, только если его еще нет?
  • Оптимизация SciPy: Матричные операции
  • Почему назначение slice быстрее, чем `list.insert`?
  • Есть ли более быстрый способ добавить два массива 2-х numpy
  • Python. Как оптимизировать функции поиска
  • Почему функция `float` медленнее, чем умножение на 1.0?
  • Целочисленный размер шага в scipy оптимизирует минимизацию
  • Как вызвать функции numpy / scipy C из Cython напрямую, без накладных вызовов Python?
  •  
    Interesting Posts for Van-Lav

    присвоение точек ячейкам

    Numpy: Конкатенация многомерных и одномерных массивов

    Сельдерей не использует все параллельные слоты

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

    Проблема с парольной фразой iphone push (pyAPns)

    Возможно ли использовать объекты подкласса Lock () в Python? Если нет, другие способы отладки тупика?

    Разделение длинного кортежа на меньшие кортежи

    Захват вывода на печать из общей библиотеки, вызванный из python с модулем ctypes

    Как django обрабатывает одновременные запросы с параллелизмом по глобальным переменным?

    Python: Рекомендуемый способ перемещения сложных структур словаря, импортированных из JSON?

    Переопределение потоков python.Thread.run ()

    Как запустить цикл событий Tornado вместе с графическим интерфейсом Kivy?

    Как я могу отформатировать свой список, чтобы передать его в качестве входа в svm.train () в opencv3.0

    Печать в представлении списка в Python

    Могу ли я использовать псевдоним для выполнения программы из сценария python

    Python - лучший язык программирования в мире.