Рубрики
Без рубрики

Как ускорить время запуска приложения Python

Внедрение новой функции Python 3.7 для измерения времени импорта. Теги с Python.

Я слышу пиронв 9.0.2 выпускается с большим улучшением времени запуска.

Я скоро попробовал, и я не чувствовал себя быстро. Поэтому я расследовал это с Python 3.7 новая функция.

В этой статье я представляю функцию и как ее использовать.

Время запуска ≒ Время импорта

Например, время исполнения Pipenv -h намного больше времени, чтобы показать справочное сообщение.

Вообще говоря, когда приложение запускается, существует некоторый процесс запуска, такой как переменные среды загрузки или файлы конфигурации.

В случае приложения Python Module Module занимает большую часть времени запуска. Например, Pipenv --version занял около 800 мс и Импорт Пипнв занял 700 мс.

$ time local/py37/bin/python3 -c 'import pipenv'

real    0m0.696s
user    0m0.648s
sys     0m0.048s

$ time local/py37/bin/pipenv --version
pipenv, version 9.0.3

real    0m0.812s
user    0m0.761s
sys     0m0.052s

Показать время импорта для модулей

Python 3.7 имеет новую функцию, чтобы показать время для импорта модулей.

Эта функция включена с -X Импорт времени вариант или PythonProfileimportte Переменная среды.

Например, вы можете профилировать время импорта Pipenv

python3.7 -X importtime -c 'import pipenv' 2> pipenv-imports

или

PYTHONPROFILEIMPORTTIME=1 pipenv --version 2>pipenv-imports

Вот пример вывода Пипенв –version.

Расследование времени импорта

Наконец вывод вы можете увидеть эти строки:

import time: self [us] | cumulative | imported package
...
import time:      3246 |     578972 |   pipenv.cli
import time:       507 |     579479 | pipenv

В последней строке 579479 означает Импорт Пипнв занял 579 479US.

При импортировании Pipenv многие другие модули импортируются. Из указанного выше примера вы можете увидеть Пипнв Импорт Pipenv.cli Отказ Подпункты отступаются с 2 пробелами.

Смотрите последнюю строчку снова. 507 означает, что только 507US был взят при запуске модуля Pipenv. 579 479 – 972US используется для поддержания.

Нахождение медленной части

Давайте найдем медленное подделка с вывода. Я выбрал некоторые строки.

import time: self [us] | cumulative | imported package
...
import time:     86500 |     179327 | pkg_resources
...
import time:       385 |     236655 |             IPython
import time:        22 |     236677 |           IPython.core
import time:        26 |     236703 |         IPython.core.magic
import time:       978 |     237680 |       dotenv.ipython
import time:       199 |     239032 |     dotenv
...
...
import time:      3246 |     578972 |   pipenv.cli
import time:       507 |     579479 | pipenv

pkg_resources.

Как видите, импортируя pkg_resources медленный. И удивительно, pkg_resources не с отступом; Это не поддержание пиронв .

Это значит pkg_resources импортируется Пипнв Сценарий, а не модуль.

$ cat local/py37/bin/pipenv
#!/home/inada-n/local/py37/bin/python3.7
# EASY-INSTALL-ENTRY-SCRIPT: 'pipenv==9.0.3','console_scripts','pipenv'
__requires__ = 'pipenv==9.0.3'
import re
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(
        load_entry_point('pipenv==9.0.3', 'console_scripts', 'pipenv')()
    )

Плохая новость: Импорт pkg_resources медленный. Это известная проблема И трудно исправить, не нарушая обратную совместимость.

Хорошая новость: Вы можете избежать импорта pkg_resources!

$ local/py37/bin/pip install wheel
$ local/py37/bin/pip install -U --force-reinstall pipenv
$ time local/py37/bin/pipenv --version
pipenv, version 9.0.3

real    0m0.704s
user    0m0.653s
sys     0m0.052s

Когда колесо установлено, PIP строит колесо и устанавливает из него.

Установка из колеса (.WHL) и из исходного пакета (.tar.gz) – разные процессы. При установке с колеса PKG_Resources не используется в скрипте:

$ cat local/py37/bin/pipenv
#!/home/inada-n/local/py37/bin/python3.7

# -*- coding: utf-8 -*-
import re
import sys

from pipenv import cli

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(cli())

Айфон

См. Следующую часть.

import time:       385 |     236655 |             IPython
import time:        22 |     236677 |           IPython.core
import time:        26 |     236703 |         IPython.core.magic
import time:       978 |     237680 |       dotenv.ipython
import time:       199 |     239032 |     dotenv

Пипнв Импорт доценв , Доценв Импорт Доценв.ипитон И он импортирует IPython Отказ

Вот почему Пипнв начинает медленно на моей среде; У меня установлен iPython.

Но почему iPython импортируется? Я прочитал источник дотенва, и я нашел это для расширения iPython.

Конечно, Pipenv и многие пользователи Dotenv не используют расширение iPython. Я сделал потянуть запрос до дотенва, который делает импорт iPython по требованию.

А поскольку пипнв имеет собственную копию дотенва, я сделал потянуть запрос к Pipenv, который удаляет Доценв. Испытание полностью.

Заключение

Я могу сократить время на Pipenv --version от 800 мс до 500 мс.

$ time local/py37/bin/pipenv --version
pipenv, version 9.0.3

real    0m0.503s
user    0m0.463s
sys     0m0.040s

Профилирование времени импорта очень приятно расследовать и оптимизировать время запуска приложения.

Оригинал: “https://dev.to/methane/how-to-speed-up-python-application-startup-time-nkf”