2014-01-06 4 views
5

Когда дело доходит до оптимизации кода Python (или любого кода), оно часто заканчивается профилированием для оптимизации узких мест или медленных функций. Однако при оптимизации этих областей кода существуют ли какие-либо варианты использования чистого Python bytecodeinline? Я знаю, что вы можете сделать это с помощью встроенной функции compile и модуля compiler.Оптимизация Python с помощью байт-кода

ответ

5

... Есть ли какие-либо варианты использования чистого байт-кода Python?

Да. Иногда вы можете выполнить немного более быстрый код, чем обычно генерирует Python.

Кроме того, вы можете получить доступ к переменным индукции цикла для понимания списков.

Вот несколько ссылок, чтобы вы начали: https://www.google.com/search?q=python+bytecode+hacks

Если вы хотели бы сделать байткодом манипуляции программно, вот рецепт оптимизации, который показывает, как идти об этом: Decorator for BindingConstants at compile time

Это говорит, если вам небезразлична скорость, простейшее ускорение часто запускается pypy вместо cpython, если это позволяет ваше приложение.

4

№ Исходный код скомпилирован в байт-код только один раз, когда модуль загружен первым. Байт-код - это то, что интерпретируется во время выполнения. Таким образом, даже если вы могли бы включить байт-код в строку в исходный код, это, скорее всего, повлияет только на время запуска программы за счет сокращения времени, затрачиваемого Python на преобразование исходного кода в байт-код. На самом деле это не изменит скорость работы кода. Например, версия «чистого байт-кода» цикла, которая выполняется 1000 раз, не будет работать быстрее, чем тот же цикл, написанный в исходном коде Python. См. this similar question, а также this one.

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

+2

Вы не собираетесь писать * тот же * байт-код Python, так же, как вы бы не использовали встроенный ассемблер для написания того же машинного кода, что и ваш компилятор C. Дело в том, чтобы написать лучший байт-код. – user2357112

+0

@ user2357112: Хотя приведенный ниже ответ предполагает, что теоретически возможно, это невозможно с помощью 'compile', потому что' compile' просто компилирует исходный код Python из строки. Если вы можете улучшить байт-код, передав строку для компиляции, вы можете получить тот же байт-код, просто поместив этот исходный код в свою программу напрямую. – BrenBarn

+0

Правда, но он также упоминает модуль 'compiler', который может быть использован для построения объектов кода, более сложных, чем' compile', как правило, дает. Конечно, проще было бы создать объекты 'types.CodeType' напрямую, если вам нравится писать байт-код python вручную. Python vm - довольно аккуратный зверь, ориентированный на стек. – Perkins

Смежные вопросы