Как перезагрузить модуль 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)

Надеюсь, это будет полезно кому-то.