Замедление работы при использовании importlib.machinery вместо использования setuptools для установки.файл so, а затем его импорт

#python #setuptools #pybind11 #python-importlib

#python #setuptools #pybind11 #python-importlib

Вопрос:

У меня возникли некоторые проблемы с пониманием того, что здесь происходит. (Случай 1) Первоначально я установил свой сгенерированный pybind11 файл .so с помощью setuptools, а затем выполнил обычный импорт в python. (Случай 2) Теперь я напрямую указываю importlib на расположение файла .so и создаю модуль «на лету». Однако при использовании модуля после выполнения всех настроек случай 1 выполняется намного быстрее, чем случай 2. То, что я сделал в случае 2,:

 import importlib
modname, filename = 'pacakge',"path/to/package.so"
loader = importlib.machinery.ExtensionFileLoader(modname, filename)
spec = importlib.machinery.ModuleSpec(
    name = modname,
    loader = loader,
    origin = filename,
)
module_going_to_use = loader.create_module(spec)

# do something with module_going_to_use 
# (and this part is much slower than Case 1).
 

Любые предложения о том, что может вызвать это?

Заранее спасибо!

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

1. Я предполагаю, что есть шаг настройки, который во втором случае откладывается до фактического использования модуля. Ключевым тестом этого является попытка использовать module_going_to_use дважды в одной и той же области. Если вы делаете то же самое, что module_going_to_use и во второй раз, выполняется ли этот второй раз быстрее? Если это произойдет, то у вас есть свой ответ. Если это так, то у вас есть веская причина делать что-то по-другому, чтобы не нести затраты на настройку при каждом запуске вашего кода.

2. Я предполагаю, что в случае 1 во время установки выполняется некоторая работа, чтобы ускорить импорт модуля во время выполнения. В случае 2 ваш код вынужден считывать и обрабатывать .so с нуля во время выполнения. Я уверен, что лучший выбор для вас — использовать вариант 1.

3. Спасибо за предложение! Но я просто рассчитал время эксперимента, о котором вы сказали, запуск два раза, похоже, не имеет эффекта. 🙁