Почему импорт моего модуля с jit-функциями занимает так много времени?

#python #numba

#python #numba

Вопрос:

Я создал модуль python, который я импортирую в записную книжку jupyter для общего использования. У меня в модуле есть несколько функций jit, около 20. Импорт модуля может занять до минуты, но если я закомментирую декораторы @njit, модуль импортирует мгновенно. Мне было интересно, знает ли кто-нибудь из мастеров python, что происходит здесь под капотом при импорте. Есть ли какой-нибудь способ сократить это мучительно долгое время импорта?

Комментарии:

1. Причина использования jit or njit заключается в том, что он компилирует функцию в машинный код, чтобы она выполнялась быстрее при последующих запусках , но помните, что в первый раз это накладные расходы с этим действием компиляции. Похоже, что, возможно, вы ожидаете этого времени компиляции для каждой функции при ее импорте

2. Спасибо за это! Да, это имеет смысл, и я учел это, но я думал, что код был скомпилирован при выполнении соответствующей функции, то есть при запуске кода, а не при импорте?

3. Обычно так и должно работать, но это может зависеть от того, как вы это реализовали. Если вы покажете некоторый код из импортируемого скрипта и то, как вы его импортируете, это может помочь прояснить проблему

4. Я думаю, что на самом деле это вызвано тем фактом, что все мои функции имеют сигнатуры, поэтому они компилируются в двоичные файлы при импорте. Если я удалю подписи, импорт будет фактически мгновенным, однако первая итерация моего моделирования (вся система представляет собой моделирование методом Монте-Карло) занимает гораздо больше времени из-за времени компиляции.

5. Да, в конечном итоге я использую их снова и снова, поэтому я вижу большое ускорение. Я просто не понимал, что код компилировался при импорте раньше. Спасибо за вашу помощь.

Ответ №1:

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