【问题标题】:how to reload a cython module interactively using pyximport如何使用 pyximport 以交互方式重新加载 cython 模块
【发布时间】:2013-07-31 01:58:17
【问题描述】:

在编写 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 优化代码的其他方法?

感谢任何帮助。

【问题讨论】:

  • 问题是cython模块被编译成共享库,无法通过reload函数重新加载。 AFAIK 目前您根本无法卸载共享库,因此您必须重新启动解释器。请注意,如果使用 Qt 控制台,可以避免重新启动 ipython:使用 Ctrl+. 仅重新启动内核,而不重新启动整个控制台。

标签: python optimization cython


【解决方案1】:

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

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

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

您可以更改您的 cython 模块,然后重新加载:

reload(mf)

希望这对某人有用。

【讨论】:

  • 太棒了。有人知道为什么它不是默认值吗?
  • 如果它对某人有帮助:出于某种原因,我必须同时执行reload(mf),然后再次执行import my_functions as mf,以便更新。但后来它起作用了。
  • 我正在尝试使用它来重新加载 .SO 文件的新版本。它似乎不起作用。在我的 python 提示符下,我做了import pyximport; pyximport.install(reload_support=True); import my_module as m。如果我将 .SO 文件替换为新文件并尝试reload(m),它仍在使用旧文件。知道如何让它工作吗?
  • 我遇到了与@Vinayak 相同的问题。我猜这个问题是导致 .SO 文件以不支持重新加载的方式编译的
  • @SalvatoreCosentino 我没有让它工作,所以我最终将我的程序分成两个不同的部分。一个不变的部分,它只是导入 .SO 文件并在其中运行一个函数,并在其中运行具有核心逻辑的 .SO 文件。不变的脚本会检查更新,当找到更新的 .SO 文件时,它会下载它,替换现有的 .SO 文件并重新启动。当没有找到更新时,它会导入 .SO 文件并在其中运行一个函数。这种方法在 Windows 和 OSX 上都适用于我。
猜你喜欢
  • 2023-03-21
  • 2021-11-20
  • 2020-05-11
  • 2010-10-27
  • 2011-11-29
  • 2019-06-07
  • 2016-02-24
  • 1970-01-01
相关资源
最近更新 更多