我在jupyter笔记本中使用Cython。
据我所知,Cython编译def函数。
但是当我想用全局变量调用函数时,它并没有看到它。
有没有方法用变量调用函数?
one1 = 1
%%cython
cimport numpy as np
cdef nump(number1):
return number1 + 1
nump(one1)
****这是示例代码,用于显示版主
答案 0 :(得分:3)
在Ipython
会话中,我可以这样做:
In [2]: %load_ext Cython
In [3]: one = 1
In [4]: %%cython
...: def foo(num):
...: return num + 1
...:
In [5]: foo(one)
Out[5]: 2
那就是我定义一个cython
函数,但是用Python调用全局变量。
如果我使用cdef
定义函数,我需要使用def
函数调用它。从Python中看不到fooc
。
In [9]: %%cython
...: cdef fooc(num):
...: return num + 2
...: def foo_call(num):
...: return fooc(num)
...:
In [10]: foo_call(one)
Out[10]: 3
如果我尝试在one
文件(魔术单元格)中使用cython
,我会收到错误,相当于Python NameError
In [8]: %%cython
...: cdef fooc(num):
...: return num + 2
...: print(fooc(one))
...:
Error compiling Cython file:
...
/home/paul/.cache/ipython/cython/....: undeclared name not builtin: one
在魔法单元格中看不到ipython
会话变量one
。
在@ DavidW的回答中,这个import
有效:
In [14]: %%cython
...: from __main__ import one
...: cdef fooc(num):
...: return num + 2
...: print(fooc(one))
...:
3
无法从Python访问此fooc
。
请注意,import
在编译时使用one
的值。
In [22]: %%cython
...: from __main__ import one
...: cdef fooc(num):
...: return num + 20
...: def fooc_call():
...: print(fooc(one))
...:
...:
In [23]: fooc_call()
21
In [24]: one=343 # new value
In [25]: fooc_call() # no change
21
In [26]: foo_call(one) # uses the current value
Out[26]: 345
答案 1 :(得分:2)
您的代码有一些错误,但我认为您要问的是错误的一行nump(one1)
undeclared name not builtin: one1
这是因为您的%%cython
代码段基本上是在自己的模块中构建的。 jupyter中的%%cython
魔法更适用于创建可在主代码中访问的编译函数,而不是访问主代码中的变量。
一种解决方案是添加行
from __main__ import *
在您的Cython区块开始时,可以访问"顶级"范围。 @hpaulj发布的答案表明了在Cython中定义函数并在块外部使用它们的更好方法。