如何使用pyximport以交互方式重新加载cython模块

时间:2013-07-30 19:00:01

标签: python optimization cython

编写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 个答案:

答案 0 :(得分:37)

我在“pyximport.install”函数中找到了一个记录不完整的功能,允许重新加载cython模块。将此功能设置为True,您可以交互式加载/重新加载cython模块,而无需重新启动python。

如果使用以下命令初始化cython模块:

import pyximport
pyximport.install(reload_support=True)
import my_functions as mf

您可以对cython模块进行更改,然后使用以下命令重新加载:

reload(mf)

希望这对某人有用。