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