cómo recargar un módulo de cython interactivamente usando pyximport

Cuando escribo el código de Python, mi flujo de trabajo típico es usar el indicador interactivo y hacer algo como

write function
repeat until working:
  test function
  edit function

Una vez que esté bastante seguro de que todo está bien, ejecutaré el código en modo no interactivo y recopilaré los resultados.

A veces las funciones se ejecutan un poco demasiado lento y se deben optimizar.

Estoy interesado en usar cython para optimizar estas funciones lentas, pero quiero mantener mi flujo de trabajo interactivo, es decir, ejecutar las funciones, realizar cambios, ejecutarlos de nuevo.

¿Hay una forma fácil de hacer esto?

Hasta ahora he intentado poner mis funciones de cython en un módulo separado "my_functions.pyx":

def fun1(int x):
    return x + 130

def fun2(int x):
    return x / 30

A continuación, en ejecución (en el indicador interactivo)

import pyximport; pyximport.install()
import my_functions as mf
mf.fun1(25)

Esto funciona la primera vez, pero quiero hacer cambios en mis funciones de cython y volver a cargarlas en la misma sesión interactiva.

corriendo

import my_functions as mf

no actualiza las funciones en absoluto. Y corriendo

reload(mf)

da un error: Ningún módulo llamado my_functions

Lo único que funciona es salir de la sesión actual, reiniciar ipython e importar el módulo nuevamente. Pero este tipo de mata los beneficios de correr de forma interactiva.

¿Hay una mejor manera de optimizar las funciones con cython interactivamente?

Si no es así, ¿puede describir otras formas de acercarse a la optimización del código con cython?

Cualquier ayuda es apreciada.

Respuestas a la pregunta(1)

Su respuesta a la pregunta