Различия между файлами Python .pyc, .pyd и .pyo

В этой статье мы рассмотрим типы файлов Python .pyc, .pyo и .pyd, а также то, как они используются для хранения байт-кода, который будет импортирован другими программами Python. Возможно, вы работали с файлами .py при написании кода Python, но вы хотите знать, что делают эти другие типы файлов и где они используются. Чтобы понять это, мы рассмотрим, как Python преобразует код, который вы пишете, в инструкции, которые машина может выполнять напрямую. Байт-код и виртуальная машина Python Python поставляется с интерпретатором

В этой статье мы переходим Питон типов файлов .pyc, .pyo и .pyd, и как они используются для хранения байткода , которые будут импортированы другими программами на языке Python.

Возможно, вы работали с файлами .py при написании кода Python, но вы хотите знать, что делают эти другие типы файлов и где они используются. Чтобы понять это, мы рассмотрим, как Python преобразует код, который вы пишете, в инструкции, которые машина может выполнять напрямую.

Байт-код и виртуальная машина Python

Python поставляется с интерпретатором, который можно использовать как REPL (read-eval-print-loop) в интерактивном режиме в командной строке. В качестве альтернативы вы можете вызвать Python с помощью скриптов кода Python. В обоих случаях интерпретатор анализирует ваш ввод, а затем компилирует его в байт-код (машинные инструкции нижнего уровня), который затем выполняется «питоническим представлением» компьютера. Это представление Pythonic называется виртуальной машиной Python .

Однако он достаточно отличается от других виртуальных машин, таких как виртуальная машина Java или виртуальная машина Erlang, и заслуживает отдельного изучения. Виртуальная машина, в свою очередь, взаимодействует с операционной системой и реальным оборудованием для выполнения машинных инструкций.

Когда вы видите типы файлов .pyc, .pyo и .pyd, важно помнить, что это файлы, созданные интерпретатором Python при преобразовании кода в скомпилированный байт-код. Компиляция исходного кода Python в байт-код является необходимым промежуточным этапом в процессе преобразования инструкций из исходного кода на понятном человеку языке в машинные инструкции, которые может выполнять ваша операционная система.

В этой статье мы рассмотрим каждый тип файла по отдельности, но сначала мы кратко рассмотрим виртуальную машину Python и байт-код Python.

Тип файла .pyc

Сначала рассмотрим тип файла .pyc. Файлы типа .pyc автоматически генерируются интерпретатором при импорте модуля, что ускоряет импорт этого модуля в будущем. Следовательно, эти файлы создаются из файла .py только в том случае, если он импортируется другим файлом или модулем .py.

Вот пример модуля Python, который мы хотим импортировать. Этот модуль вычисляет факториалы.

 # math_helpers.py 
 
 # a function that computes the nth factorial, eg factorial(2) 
 def factorial(n): 
 if n == 0: 
 return 1 
 else: 
 return n * factorial(n - 1) 
 
 # a main function that uses our factorial function defined above 
 def main(): 
 print("I am the factorial helper") 
 print("you can call factorial(number) where number is any integer") 
 print("for example, calling factorial(5) gives the result:") 
 print(factorial(5)) 
 
 # this runs when the script is called from the command line 
 if __name__ == '__main__': 
 main() 

Теперь, когда вы просто запускаете этот модуль из командной строки, используя python math_helpers.py , файлы .pyc не создаются.

Теперь давайте импортируем это в другой модуль, как показано ниже. Мы импортируем факториал из файла math_helpers.py и используем его для вычисления факториала 6.

 # computations.py 
 
 # import from the math_helpers module 
 from math_helpers import factorial 
 
 # a function that makes use of the imported function 
 def main(): 
 print("Python can compute things easily from the REPL") 
 print("for example, just write : 4 * 5") 
 print("and you get: 20.") 
 print("Computing things is easier when you use helpers") 
 print("Here we use the factorial helper to find the factorial of 6") 
 print(factorial(6)) 
 
 # this runs when the script is called from the command line 
 if __name__ == '__main__': 
 main() 

Мы можем запустить этот скрипт, вызвав python computations.py в терминале. Мы не только получаем результат 6 факториала, то есть 720, но мы также замечаем, что интерпретатор автоматически создает файл math_helpers.pyc. Это происходит потому, что модуль вычислений импортирует модуль math_helpers. Для ускорения загрузки импортированного модуля в будущем интерпретатор создает файл байт-кода модуля.

При обновлении файла исходного кода обновляется и файл .pyc. Это происходит всякий раз, когда время обновления исходного кода отличается от времени обновления файла байт-кода и обеспечивает актуальность байт-кода.

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

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

Тип файла .pyo

Тип файла .pyo также создается интерпретатором при импорте модуля. Однако файл .pyo является результатом запуска интерпретатора при включенных настройках оптимизации.

Оптимизатор включается добавлением флага «-O» при вызове интерпретатора Python. Вот пример кода, иллюстрирующий использование оптимизации. Во-первых, у нас есть модуль, определяющий лямбда. В Python лямбда похожа на функцию, но определяется более лаконично.

 # lambdas.py 
 
 # a lambda that returns double whatever number we pass it 
 g = lambda x: x * 2 

Если вы помните из предыдущего примера, нам нужно будет импортировать этот модуль, чтобы использовать его. В следующем листинге кода мы импортируем lambdas.py и используем лямбда g

 # using_lambdas.py 
 
 # import the lambdas module 
 import lambdas 
 
 # a main function in which we compute the double of 7 
 def main(): 
 print(lambdas.g(7)) 
 
 # this executes when the module is invoked as a script at the command line 
 if __name__ == '__main__': 
 main() 

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

Чтобы запустить этот пример с помощью оптимизатора, вызовите команду:

 $ python -O using_lambdas.py 

Мы не только получаем правильный результат удвоения 7, то есть 14, в качестве вывода в командной строке, но мы также видим, что для нас автоматически создается новый файл байт-кода. Этот файл основан на импорте lambdas.py при вызове using_lambdas.py . Поскольку у нас был включен оптимизатор, создается файл байт-кода .pyo. В данном случае он называется lambdas.pyo .

Оптимизатор, который мало что делает, удаляет утверждения assert из вашего байт-кода. Результат в большинстве случаев будет незаметен, но могут быть случаи, когда он вам понадобится.

Также обратите внимание, что, поскольку создается файл байт-кода .pyo, он заменяет файл .pyc, который был бы создан без оптимизации. При обновлении файла исходного кода файл .pyo обновляется всякий раз, когда время обновления исходного кода отличается от времени обновления файла байт-кода.

Тип файла .pyd

Тип файла .pyd, в отличие от двух предыдущих, зависит от платформы для класса операционных систем Windows. Таким образом, его можно часто встретить в персональных и корпоративных выпусках Windows 10, 8, 7 и других.

В экосистеме Windows файл .pyd - это файл библиотеки, содержащий код Python, который может вызываться и использоваться другими приложениями Python. Чтобы сделать эту библиотеку доступной для других программ Python, она упакована в виде библиотеки динамической компоновки.

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

Файл .pyd - это библиотека динамической компоновки, которая содержит модуль Python или набор модулей, которые будут вызываться другим кодом Python. Чтобы создать файл .pyd, вам необходимо создать модуль с именем, например, example.pyd . В этом модуле вам нужно будет создать функцию с именем PyInit_example() . Когда программы вызывают эту библиотеку, им нужно вызвать import foo , и PyInit_example() будет запущена.

Для получения дополнительной информации о создании собственных файлов Python .pyd ознакомьтесь с этой статьей .

Различия между этими типами файлов

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

Третий тип файла, .pyd, отличается от двух предыдущих тем, что представляет собой динамически подключаемую библиотеку, которая будет использоваться в операционной системе Windows. Два других типа файлов можно использовать в любой операционной системе, а не только в Windows.

Однако каждый из этих типов файлов включает код, который вызывается и используется другими программами Python.

Заключение

В этой статье мы описали, как каждый специальный тип файла, .pyc, .pyo и .pyd, используется виртуальной машиной Python для повторного использования кода. Как мы видели, каждый файл имеет свои особые цели и варианты использования, будь то ускорение загрузки модуля, ускорение выполнения или облегчение повторного использования кода в определенных операционных системах.

comments powered by Disqus