【问题标题】:Why jupyter notebook only prints the cython result once?为什么 jupyter notebook 只打印一次 cython 结果?
【发布时间】:2020-03-23 04:04:19
【问题描述】:

我是 cython 的新手(现在只用它来做一点硬件)。 我使用以下代码在 jupyter notebook 中查看了它的大致概念。

%load_ext Cython
%%cython
def cfunc(int n):
    cdef int a = 0
    for i in range(n):
        a += i
    return a

print(cfunc(10))

但是,它只打印一次结果 45。当我运行打印功能时,单元格不显示 45 人。

代码有问题吗?如何使单元格打印出 45 与普通 python 代码一样?谢谢。

【问题讨论】:

    标签: python cython


    【解决方案1】:

    当运行%%cython-magic 时,引擎盖下发生了很多事情。在详细模式下调用魔法时可以看到它的一部分,即%%cython --verbose

    1. 会生成一个名为_cython_magic_b599dcf313706e8c6031a4a7058da2a2.pyx 的文件。 b599dcf313706e8c6031a4a7058da2a2%%cython-cell 的 sha1-hash,例如为了能够重新加载 %%cython-cell(参见 SO-post)。
    2. 此文件经过 cythonized 并构建为名为 _cython_magic_b599dcf313706e8c6031a4a7058da2a2 的 c 扩展名。
    3. 这个扩展被导入 - 这是你的代码打印 45 的时刻,来自这个模块的所有东西都被添加到全局命名空间中。

    当您再次执行该单元格时,上述任何情况都不会发生:鉴于机器可以看到的 sha-hash,该单元格已被执行并加载 - 所以无需执行任何操作。只有当单元格的内容发生变化并因此其哈希值发生变化时,才会使用现金,但会执行上述 3 个步骤。

    要强制执行上述步骤,必须将--force(或-f)选项传递给%%cython-magic-cell,即:

    %%cython --force
    ...
    
    # 45 is printed
    

    但是,由于重新构建扩展非常耗时,因此可能会更喜欢以下内容

    %%cython
    def cfunc(int n):
      cdef int a = 0
      for i in range(n):
        a += i
      return a
    
    # put the code of __main__ into a function
    def cython_main():
       print(cfunc(10))
    
    # execute the old main
    cython_main()
    

    现在在一个新单元格中调用cython_main(),因此它会以与普通 python 代码相同的方式重新评估。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多