Подтвердить что ты не робот

Ускорение загрузчика python "import"

Я серьезно разочаровываюсь в том, как медленный запуск python. Просто импортирование более или менее базовых модулей занимает второе место, поскольку python работает с sys.path, ища соответствующие файлы (и генерирует 4 stat() звонки - [ "foo", "foo.py", "foo.pyc", "foo.so" ] - для каждой проверки). Для сложной среды проекта с множеством разных каталогов это может занять около 5 секунд - все, чтобы запустить script, который может сработать мгновенно.

Есть ли у людей предложения по ускорению этого процесса? Например, один хак, который я видел, - это установить переменную среды LD_PRELOAD_32 в библиотеку, которая кэширует результат вызовов ENOENT (например, неудачных вызовов stat()) между прогонами. Конечно, у этого есть всевозможные проблемы (потенциально запутывающие программы, отличные от python, отрицательное кеширование и т.д.).

4b9b3361

Ответ 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