当我使用cython编译一个单元格时,似乎Jupyter忘记了下一个单元格中的编译函数。这在我看来是不对的。出了什么问题?
我正在使用笔记本的5.0.0版本和
Python 3.6.1 |Anaconda custom (x86_64)| (default, May 11 2017, 13:04:09)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]
这是一个产生问题的MWE:
单元格1:
%load_ext Cython
Cell 2:
%%cython
cdef int foo():
return 3
print(foo())
这会产生:
3
在下一个单元格中,我有
print(foo())
这会产生:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-3-9701608cebc0> in <module>()
----> 1 print(foo())
NameError: name 'foo' is not defined
答案 0 :(得分:6)
我猜是因为你没有将你的foo
函数定义为python中可用的函数(cpdef
),但只给它一个C签名({{1}因此它只能从cython代码中调用
在单元格2中你可以调用它,因为你仍在使用cython代码,但是在你的单元格3中你又回到了纯python中并且该函数不可用。有多种方法可以从python中的cdef
函数获得结果:
foo
您现在可以尝试在python代码中调用%%cython
# Not reachable in pure python:
cdef int foo():
return 3
# Python visible function signature:
cpdef int foo2():
return 3
# Or a wrapper around the cython function:
def foo3():
return foo()
或foo2()
。
如果您还没有看到,请参阅documentation的相关部分之一。