为什么Jupyter笔记本电脑会忘记"从一个小区到另一个小区的Cython?

时间:2017-08-21 08:41:44

标签: jupyter-notebook cython

当我使用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

1 个答案:

答案 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的相关部分之一。