当前位置: 首页 > 知识库问答 >
问题:

为什么jupyter笔记本只打印一次cython结果?

吕霄
2023-03-14

我是cython的新手(现在只用于做一点hw)。我使用下面的代码在jupyter笔记本中查看它的总体思路。

%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代码完全相同?谢谢

共有1个答案

赫连骏
2023-03-14

运行cython时,引擎盖下会发生很多神奇的事情。在详细模式下调用magic时,可以看到部分内容,即cython--verbose:

  1. 一个名为cython\u magic\u b599dcf313706e8c6031a4a7058da2a2的文件。生成pyxb599dcf313706e8c6031a4a7058da2a2是%%cython-单元格的sha1哈希,例如,需要它才能重新加载%%cython-单元格(请参阅本文)
  2. 此文件经过cythonized并构建为名为cython\u magic\u b599dcf313706e8c6031a4a7058da2a2的c扩展名
  3. 导入此扩展-此时您的代码将打印45,并且此模块中的所有内容都将添加到全局命名空间中

当您再次执行该单元格时,上面的任何操作都不会发生:给定机器可以看到的sha哈希,该单元格已经执行并加载了,因此无需执行任何操作。只有当单元格的内容发生更改,因此其哈希值将不使用现金,而是执行上述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\u main(),因此它会像普通python代码一样重新计算。

 类似资料:
  • 当我执行以下代码时,为什么分配给输出的变量名只在我第一次使用时打印......而不是每次使用时打印? 当我运行它时。。。这就是它看起来的样子 我的第一头渡渡鸟 我的第一段。 我的第二段。 我希望它看起来像这样 我的第一头渡渡鸟 我的第一段渡渡鸟 我的第二段。多多鸟

  • 我是Jupyter笔记本电脑的新手,Jupyter笔记本电脑和JupyterLab的主要区别是什么,建议我选择最好的,以后应该使用。

  • 问题内容: 我正在研究Jupyter Notebook,并希望通过使用Google GPU使其运行更快。我已经进行了一些研究并找到了解决方案,但是它对我没有用。 解决方案是: “最简单的方法是使用Connect to Local Runtime, 然后选择硬件加速器作为GPU,如Google Colab Free GPU Tutorial中所示 。” 我确实设法将googe colab连接到jup

  • 每个人我最近在学习如何反应。正如这个链接所说,我学到了一个教训:react函数加载两次。但当我验证它时,我发现它确实加载了两次,但Chrome浏览器只打印了一次。我想知道为什么?这是我验证过的代码。 我认为铬应该混合。日志 1 App.js: 9我已经跑了1次!2pp.js: 9我已经跑了两次了! 我想知道为什么。非常感谢。

  • 我试图使用liner_profiler库在jupyter笔记本与cython函数。它只工作了一半。我得到的结果只包括函数的第一行,没有分析结果。 对于分析结果,int onlt显示一行代码

  • 所以我使用joblib来并行化一些代码,我注意到在jupyter笔记本中使用它时无法打印东西。 我尝试在ipython中使用相同的示例,效果非常好。 下面是一个在jupyter笔记本电脑中写入的最小(非)工作示例 所以我得到的输出为但没有打印任何内容。 我期望看到的(打印顺序在现实中可能是随机的): 您可以在笔记本进程的日志中看到打印。但我希望打印发生在笔记本上,而不是笔记本过程的日志。 我已经打