【问题标题】:Calling Python function from Cython code, inside a Google Colab notebook在 Google Colab 笔记本中从 Cython 代码调用 Python 函数
【发布时间】:2020-12-18 22:33:58
【问题描述】:

我正在使用 Google Colab 笔记本。我在同一个笔记本中使用 Cython 执行了一段特殊的计算密集型代码。在这段代码中,我想调用一个函数(在同一笔记本的另一个单元格中用 Python 定义)。

现在,该函数已与我的其他纯 Python 代码高度集成,并且无法为 Cython 重写和重新定义内容。

我的问题是:如何从另一个用 Cython 编译的单元格调用用 Python 编写的函数?

我已经看过的链接: Call python file with python imports from C using cython

【问题讨论】:

    标签: python function cython


    【解决方案1】:

    通常,您会将整个功能放入一个模块中,然后将其导入%%cython-cell。

    另一种不太干净(但在笔记本的情况下可能可以接受)的方式是从__main__ 导入,例如:

    [1]: def foo():
             print("I'm main foo")
    

    然后:

    [2]: %%cython
         def usefoo():
             from __main__ import foo
             foo()
    

    现在:

    [3]: usefoo()
    I'm main foo
    

    另一种变体是从 __main__ 导入 foo 略有不同:

    [2]: %%cython
         from __main__ import foo
         def usefoo2():
             foo()
    

    有两个主要区别:

    1. 如果foo (尚未)在__main__ 中定义,第二个%%cython-cell 将失败。如果在调用函数 usefoo 期间未定义或不再定义 foo,则第一个版本将失败。
    2. 如果foo__main__ 中更改,第一个版本将使用当前版本,而第二个版本将始终使用从%%cython-cell 构建的那一刻起的版本(这可能与@ 987654337@-cell 由于缓存而运行)。这可能会让人很困惑。

    从长远来看,这种方式非常令人困惑和令人费解,因此在短暂的试用阶段后,我会改用使用专用模块的更可持续的方法。

    【讨论】:

      猜你喜欢
      • 2018-04-30
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2019-12-17
      • 2020-11-28
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      相关资源
      最近更新 更多