Как перезагрузить модуль cython в интерактивном режиме с помощью pyximport
При написании кода python мой типичный рабочий процесс - использовать интерактивное приглашение и делать что-то вроде
write function
repeat until working:
test function
edit function
Как только я уверен, что все в порядке, я запустил код в неинтерактивном режиме и собрал результаты.
Иногда функции работают слишком медленно и должны быть оптимизированы.
Мне интересно использовать cython для оптимизации этих медленных функций, но я хочу сохранить свой интерактивный рабочий процесс, то есть запустить функции, внести изменения, снова запустить их.
Есть ли простой способ сделать это?
До сих пор я пытался помещать свои функции cython в отдельный модуль "my_functions.pyx":
def fun1(int x):
return x + 130
def fun2(int x):
return x / 30
Затем запустите (в командной строке)
import pyximport; pyximport.install()
import my_functions as mf
mf.fun1(25)
Это работает впервые, но я хочу внести изменения в мои функции cython и перезагрузить их в одном и том же интерактивном сеансе.
работает
import my_functions as mf
не обновляет функции вообще. И запуск
reload(mf)
дает ошибку: Нет модуля с именем my_functions
Единственное, что работает, это выйти из текущего сеанса, перезапустить ipython и снова импортировать модуль. Но этот вид убивает преимущества работы в интерактивном режиме.
Есть ли лучший способ оптимизировать функции с помощью cython в интерактивном режиме?
Если нет, можете ли вы описать некоторые другие способы подхода к оптимизации кода с помощью cython?
Любая помощь приветствуется.
Ответы
Ответ 1
Я обнаружил плохо документированную функцию в функции "pyximport.install", которая позволяет перезагрузить модуль cython. Если для этой функции установлено значение True, вы можете загружать/перезагружать модули cython в интерактивном режиме, не перезагружая python.
Если вы инициализируете свой модуль cython с помощью:
import pyximport
pyximport.install(reload_support=True)
import my_functions as mf
Вы можете внести изменения в свой модуль cython, а затем перезагрузить с помощью:
reload(mf)
Надеюсь, это будет полезно кому-то.