跑步时%%cython
-很多魔法都发生在幕后。当以详细模式调用魔法时,人们可以看到它的一部分,即%%cython --verbose
:
- 一个名为
_cython_magic_b599dcf313706e8c6031a4a7058da2a2.pyx
被生成。b599dcf313706e8c6031a4a7058da2a2
是 sha1 哈希值%%cython
-cell,例如,需要它才能重新加载%%cython
-细胞(参见这个SO-post).
- 该文件被 cythonized 并构建为名为的 c 扩展
_cython_magic_b599dcf313706e8c6031a4a7058da2a2
.
- 该扩展被导入 - 这是您的代码打印 45 的时刻,并且该模块中的所有内容都被添加到全局命名空间中。
如果再次执行该单元,则上述情况都不会发生。这是因为%%Cython
机器可以看到单元已经执行并加载 - 因此无需执行任何操作。如果单元格发生更改(因为单元格更改会更改 sha1 哈希)或者重新启动在 Jupyter Lab 中运行的 Python 内核(例如),则将重复上述 3 个步骤。
为了强制执行上述步骤,必须通过--force
(or -f
) 选项%%cython
-magic-cell,即:
%%cython --force
...
# 45 is printed
但是,由于编译 Cython 代码可能非常耗时,因此人们可能更喜欢下面给出的示例之类的内容。
%%cython
def cfunc(int n):
cdef int a = 0
for i in range(n):
a += i
return a
def cython_main(int arg1):
# Print the output from calling the funtion
print(cfunc(arg1))
# And/or return the output
return(cfunc(arg1))
NOTE:
The cython_main()
上面给出的函数需要与任何函数位于同一单元格中def
, cdef
, or cpdef
它调用的函数,但从单独的单元格调用以解决OP中提出的打印问题。
这是一个调用的示例cython_main()
函数从一个单独的单元格将值 10 传递给cfunc()
:
result = cython_main(10)
结果是:
45
这解决了OP中描述的打印问题,因为调用cython_main()
从外部%%Cython
cell 会强制重新调用 cfunc(),即使该 cell 之前已被执行过。