运行时,
%%cython魔术发生在引擎盖下。在详细模式下调用魔术时,可以看到其中的一部分,即
%%cython --verbose:
_cython_magic_b599dcf313706e8c6031a4a7058da2a2.pyx
生成一个名为的文件。b599dcf313706e8c6031a4a7058da2a2
是%%cython
-cell的sha1-hash,例如,它是重新加载%%cython
-cell所必需的(请参阅此SO-post)。- 该文件被cython化并构建为名为的c扩展名
_cython_magic_b599dcf313706e8c6031a4a7058da2a2
。 - 此扩展名已导入-这是您的代码打印45的时刻,此模块中的所有内容都添加到了全局名称空间中。
当您再次执行该单元格时,以上内容均不会发生:给定机器可以看到的哈希值,该单元格已被执行并加载-
因此无所事事。仅当单元格的内容发生更改并因此更改其哈希值时,才会使用现金,而是执行上述3个步骤。
要强制执行上述步骤,必须将
--force(或
-f)选项传递给
%%cython-magic-cell,即:
%%cython --force...# 45 is printed
但是,由于重新构建扩展非常耗时,因此可能更喜欢以下内容
%%cythondef cfunc(int n): cdef int a = 0 for i in range(n): a += i return a# put the pre of __main__ into a functiondef cython_main(): print(cfunc(10))# execute the old maincython_main()
现在调用
cython_main()一个新的单元格,因此它以与普通python代码相同的方式重新评估。



