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

Python 如何使用pyximport以交互方式重新加载cython模块,python,optimization,cython,Python,Optimization,Cython,在编写python代码时,我的典型工作流程是使用交互式提示并执行以下操作 write function repeat until working: test function edit function 一旦我确定一切正常,我将以非交互模式运行代码并收集结果 有时函数运行有点太慢,必须进行优化 我对使用cython优化这些缓慢的功能感兴趣,但我想保持我的交互式工作流,即运行功能、进行更改、再次运行它们 有没有一个简单的方法可以做到这一点 到目前为止,我已经尝试将cython函数放在单独

在编写python代码时,我的典型工作流程是使用交互式提示并执行以下操作

write function
repeat until working:
  test function
  edit function
一旦我确定一切正常,我将以非交互模式运行代码并收集结果

有时函数运行有点太慢,必须进行优化

我对使用cython优化这些缓慢的功能感兴趣,但我想保持我的交互式工作流,即运行功能、进行更改、再次运行它们

有没有一个简单的方法可以做到这一点

到目前为止,我已经尝试将cython函数放在单独的模块“my_functions.pyx”中:

然后运行(在交互提示下)

这是第一次工作,但我想对cython函数进行更改,并在同一个交互式会话中重新加载它们

运行

import my_functions as mf
根本不更新函数。跑步

reload(mf)
给出一个错误: 没有名为my_函数的模块

唯一有效的方法是退出当前会话,重新启动ipython,然后重新导入模块。但是,这种方式扼杀了交互式运行的好处

有没有更好的方法用cython交互优化函数

如果没有,您能描述一些其他的方法来使用cython优化代码吗


非常感谢您的帮助。

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

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

import pyximport
pyximport.install(reload_support=True)
import my_functions as mf
您可以对cython模块进行更改,然后重新加载:

reload(mf)

希望这对某些人有用。

问题是cython模块被编译到共享库中,不能通过
reload
函数重新加载。AFAIK目前无法卸载共享库,因此必须重新启动解释器。请注意,如果使用Qt控制台,可以避免重新启动ipython:使用
Ctrl+。
仅重新启动内核,而不重新启动整个控制台。有人知道为什么它不是默认值吗?以防它对某人有所帮助:出于某种原因,我必须同时执行
重新加载(mf)
,然后第二次执行
将我的函数作为mf导入,以便更新。但它还是可以工作的。我正试图用它来重新加载.SO文件的新版本。它似乎不起作用。在python提示符中,我导入了pyximport;pyximport.install(reload_support=True);将my_模块作为m导入
。如果我用一个新文件替换.SO文件并尝试重新加载(m)它仍然使用旧文件。你知道如何让它工作吗?我和@Vinayak有同样的问题。我猜问题是由.SO文件以不支持reload@SalvatoreCosentino我没有让它工作,所以我把我的程序分成了两个不同的部分。一个不变的部分,只需导入.SO文件并在其中运行函数,以及在其中包含核心逻辑的.SO文件。不变的脚本检查更新,当找到更新的.SO文件时,它将下载该文件,替换现有的.SO文件并重新启动自身。当找不到更新时,它将导入.SO文件并在其中运行函数。这种方法在Windows和OSX上都适用。
import pyximport
pyximport.install(reload_support=True)
import my_functions as mf
reload(mf)