Ускорение загрузчика Python "импорт"
Я серьезно расстраиваюсь из-за медленного запуска Python. Простой импорт более или менее базовых модулей занимает секунду, так как python запускает sys.path в поисках подходящих файлов (и генерирует 4 stat()
звонки - ["foo", "foo.py", "foo.pyc", "foo.so"] - для каждой проверки). В сложной проектной среде с множеством разных каталогов это может занять около 5 секунд - и все это для запуска скрипта, который может мгновенно завершиться с ошибкой.
Есть ли у людей предложения о том, как ускорить этот процесс? Например, один взлом, который я видел, это установить LD_PRELOAD_32
переменная окружения для библиотеки, которая кэширует результат ENOENT
звонки (например, не удалось stat()
звонки) между пробегами. Конечно, это имеет все виды проблем (потенциально запутывающие непитоновские программы, отрицательное кеширование и т. Д.).
4 ответа
Застегивать как можно больше pyc
файлы, насколько это возможно (с правильной структурой каталогов для пакетов), и размещение этого zip-файла в качестве самой первой записи в sys.path (на лучшем доступном локальном диске, в идеале) может значительно ускорить время запуска.
Первые вещи, которые приходят на ум:
- Попробуйте меньший путь
- Убедитесь, что ваши модули pyc, чтобы они загружались быстрее
- Убедитесь, что вы не удваиваете импорт или импортируете слишком много
Кроме этого, вы уверены, что дисковые операции вас утомляют? Ваш диск / операционная система действительно загружены или старые и медленные?
Может быть, дефрагментация в порядке?
При попытке ускорить процесс профилирование является ключевым моментом. Иначе как узнать, какие части вашего кода действительно медленные?
Некоторое время назад я создал среду выполнения и визуализатор профиля импорта тунца, и я думаю, что он может быть здесь полезен. Просто создайте профиль импорта (с Python 3.7+) и запустите на нем tuna:
python3.7 -X importtime -c "import scipy" 2> scipy.log
tuna scipy.log
Если у вас не хватает опций, вы можете создать виртуальный диск для хранения ваших пакетов Python. RAM-диск отображается как каталог в вашей файловой системе, но на самом деле он отображается непосредственно в оперативную память вашего компьютера. Вот несколько инструкций для Linux/Redhat.
Осторожно: виртуальный диск является нестабильным, поэтому вам также необходимо хранить резервную копию ваших файлов на обычном жестком диске, иначе вы потеряете данные, когда компьютер выключится.
Чего-то не хватает в вашей посылке - я никогда не видел, чтобы некоторые "более или менее" базовые модули занимали импорт за секунду, и я не использую Python на том, что я бы назвал самым современным оборудованием. Либо вы работаете на каком-то серьезно старом оборудовании, либо работаете на перегруженной машине, либо ваша ОС или установка Python каким-то образом повреждена. Или вы на самом деле не импортируете "базовые" модули.
Если это какая-либо из первых трех проблем, вам нужно найти корневую проблему для ее решения. Если это последнее, нам действительно нужно знать, какие конкретные пакеты могут оказать какую-либо помощь.