如何在Jupyter Notebook中使用Cython声明全局变量?

5

我有一些变量应该在程序中全局访问。由于它们经常使用,我考虑给它们一个类型,据我理解这将加快速度。

但我无法这样做。在Jupyter Notebook的一个块中,我有以下代码:

%%cython
cdef int magic_number = 42

在下一个区块中,我收到了以下错误信息:
print(magic_number)

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-34-a40fcb730ac3> in <module>()
----> 1 print(magic_number)

NameError: name 'magic_number' is not defined

cpdef 也无法使用。如何获取全局变量?

1个回答

2
这是一个与问题“在Jupyter中运行Cython cdef”非常相似的问题 - cdef对象无法从Python中访问。
如果您想让变量从Python中访问,则只需以正常的Python方式声明即可。
magic_number = 42

请注意,您无法键入这些变量。我认为没有任何方法使用Python C API创建“模块属性”来访问C变量,因此Cython无法实现此功能。如果在Cython中输入这些变量很重要,则必须创建访问器函数以从Python与它们交互:

%%cython
cdef int magic_number = 42
def get_magic_number():
    global magic_number # not strictly necessary, but clearer
    return magic_number
def set_magic_number(int value):
    global magic_number # necessary
    magic_number = value

(请注意,cpdef 仅适用于函数,对于变量定义没有意义。)

我尝试分割你给的最后一个代码块,前两行成为了第一个代码块,剩下的(第一行加上了 %%cython)成为了第二个代码块。但是它不能正常运行。只有当所有内容在一个代码块中时才能正常运行(就像你所做的那样)。为什么? - plx
因为除了cdef class以外的任何cdef都只能通过Cython访问。这两个函数是使用Cython编译的(因此在Cython块中),但可以从Python调用。它们的目的是提供一种从Python访问变量的方式。 - DavidW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接