Практика Python для принудительной компиляции байт-кода?(.Pyc) - PullRequest
3 голосов
/ 06 августа 2011

Я читал о интерпретаторе Python, потому что я не мог понять, почему некоторые вещи имели скомпилированные объекты Python (.pyc), а другие нет.

Я получил ответ на свой вопрос,но сейчас я в замешательстве.Итак, интерпретатор компилирует скрипт в модуль ... который "как бы" похож на объект в C, если я правильно понимаю (программист C здесь, новичок в Python) - или я думаю, больше как .classв Java, поскольку он скомпилирован байт-кодом, а не нативными инструкциями ... в любом случае он делает это, когда вы либо импортируете скрипт, ИЛИ если вы явно вызываете его для компиляции (что по какой-то причине менее выгодно).при этом понимании, есть ли разница во времени выполнения между скомпилированным байт-кодом и нет?Предполагая, что имеется только один интерпретатор (интерпретатор байт-кода), это будет означать, что если модуль еще не скомпилирован, он должен выполнить грамматику / лексирование / синтаксический анализ (компиляцию) непосредственно перед выполнением интерпретации.Не приведет ли это к увеличению времени выполнения?

Так что, если вы примете приведенное выше, то, очевидно, будет лучше, если модули скомпилированы в .pyc, а не запускаются как стандартный скрипт .py наfly.

Значит ли это, что в вашем основном прогоне лучше иметь как можно меньше исполнений?

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

То есть вместо:

# file.py:
def main():
    <stuff goes here - setup, whatever shared resources different modules need, etc.>

main()

Было бы лучшесделать:

# wrapper.py:
from file.py import *
main()

Надеюсь, я объяснил, что я спрашиваю, достаточно хорошо.Вполне возможно, что я неправильно понял, как интерпретатор / компилятор используется в Python, и этот вопрос даже не разумно задавать - я совершенно новичок в Python.

TIA

Ответы [ 2 ]

6 голосов
/ 06 августа 2011

Вы правы:

1) .pyc-файл - это кэшированная копия компиляции исходного кода Python в байт-код

2) Файл .pyc создается при импорте модуля

3) Основная программа, которую вы называете в командной строке python, не скомпилирована в .pyc

4) Поэтому основная программа компилируется при каждом запуске.

Но:

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

tl; dr: не беспокойся об этом.

0 голосов
/ 24 февраля 2017

Это для начинающих,

Python автоматически компилирует ваш скрипт в скомпилированный код, так называемый байт-код, перед его запуском.

Запуск скрипта не считается импортом и не .pycбудет создан.

Например, если у вас есть файл сценария abc.py, который импортирует другой модуль xyz.py, при запуске abc.py будет создан файл xyz.pyc, так как xyz импортирован, но нетФайл abc.pyc будет создан, поскольку файл abc.py не импортируется.

Если вам нужно создать файл .pyc для модуля, который не импортирован, вы можете использовать модули py_compile и compileall.

Модуль py_compile может вручную скомпилировать любой модуль.Одним из способов является интерактивное использование функции py_compile.compile в этом модуле:

import py_compile

py_compile.compile ('abc.py'). Это позволит записать .pyc в то же место, что и abc.py (выможет переопределить это с помощью необязательного параметра cfile).

Для более подробной информации: http://effbot.org/pyfaq/how-do-i-create-a-pyc-file.htm

...