Как Python 3.2 обрабатывает вызовы функций из циклов? - PullRequest
1 голос
/ 10 сентября 2011

Меня беспокоит не определенные мной функции, а встроенные функции или esp. из импортированных модулей. В основном, эти советы по-прежнему применимы?

http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Avoiding_dots...

http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Local_Variables

Я думаю, что JIT PyPy мог бы помочь мне и здесь, но мне нужно запустить его на кластере Linux (и мой источник уже для Py3k).

1 Ответ

4 голосов
/ 10 сентября 2011

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

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