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

在jupyter笔记本中使用cython进行线条分析

周宸
2023-03-14

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

%%cython -a
# cython: linetrace=True
# cython: binding=True
# distutils: define_macros=CYTHON_TRACE_NOGIL=1
import numpy as np
cimport numpy as np
from datetime import datetime
import math


cpdef np.int64_t get_days(np.int64_t year, np.int64_t month):
    cdef np.ndarray months=np.array([31,28,31,30,31,30,31,31,30,31,30,31])
    if month==2:
        if (year%4==0 and year%100!=0) or (year%400==0):
            return 29
    return months[month-1]

对于分析结果,int onlt显示一行代码

    Timer unit: 1e-07 s

Total time: 0.0015096 s
File: .ipython\cython\_cython_magic_0154a9feed9bbd6e4f23e57d73acf50f.pyx
Function: get_days at line 15

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    15                                           cpdef np.int64_t get_days(np.int64_t year, np.int64_t month):

共有1个答案

萧树
2023-03-14

这可以看作是line_profiler中的错误(如果它应该支持Cython)。要获取分析函数的代码line_profiler读取pyx-file并尝试在inspect.getblock的帮助下提取代码:

...
# read pyx-file
all_lines = linecache.getlines(filename)
# try to extract body of the function strarting at start_lineno:
sublines = inspect.getblock(all_lines[start_lineno-1:])
...

但是,getblockcpdef-函数一无所知,因为python只有def-函数,因此会产生错误的函数体(即只有签名)。

解决方法:

一个简单的解决方法是引入一个虚拟的def函数,它将是cpdef函数的哨兵,以这种方式进行检查。getblock将生成sentinel函数的整个cpdef函数体,即:

%%cython
...
cpdef np.int64_t get_days(np.int64_t year, np.int64_t month):
    ...

def get_days_sentinel():
    pass

现在,报告lprun-f get\u days get\u days(2019,3)如下所示:

Timer unit: 1e-06 s

Total time: 1.7e-05 s
File: XXXX.pyx
Function: get_days at line 10

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    10                                           cpdef np.int64_t get_days(np.int64_t year, np.int64_t month):
    11         1         14.0     14.0     82.4      cdef np.ndarray months=np.array([31,28,31,30,31,30,31,31,30,31,30,31])
    12         1          1.0      1.0      5.9      if month==2:
    13                                                   if (year%4==0 and year%100!=0) or (year%400==0):
    14                                                       return 29
    15         1          2.0      2.0     11.8      return months[month-1]
    16                                           
    17                                           def get_days_sentinel():
    18                                               pass

哨兵仍然有一些丑陋的尾随线,但最好什么都看不到。

 类似资料:
  • 我有一些问题在python导入。我不太明白为什么会有错误。 我使用jupyter笔记本从目录笔记本。我需要导入函数位于 对于导入,我尝试使用 正如这里https://docs.python.org/3/reference/import.html(第5.7段)和python显示我一个错误试图相对导入超过顶级包。 包

  • 我正在尝试做一些深度学习的工作。为此,我首先在我的Python环境中安装了所有用于深度学习的包。 这就是我所做的。 在Anaconda中,我创建了一个名为的环境,如下所示 然后在其中安装了data science Python包,如Pandas、NumPy等。我还在那里安装了TensorFlow和Keras。下面是该环境中的包列表 您可以看到还安装了。 现在,当我在这个环境中打开Python解释器

  • 我在Windows 10上运行Anaconda,并使用Jupyter Notebook进行机器学习项目。 我最近开始意识到Conda中的虚拟环境。 我使用以下命令在conda中创建了一个虚拟环境 激活环境 ipykernel中安装的环境(不确定使用的术语是否正确) 现在环境是可见的jupyter笔记本,但当我启动它我得到

  • 问题内容: 在IPython / Jupyter Notebook中运行的大多数语言内核的错误报告都指出发生错误的行;但是(至少默认情况下)在笔记本电脑中未显示行号。 是否可以将行号添加到IPython / Jupyter Notebook? 问题答案: -在CodeMirror区域中切换行号。有关其他键盘快捷键,请参见快速帮助。 详细信息- (或)将您带入命令模式,然后按键应切换当前单元格行号的

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

  • 我正在寻找合并一些cython来加速我的代码。我在Jupyter中运行cython代码时遇到问题。 牢房1: 单元格2: 错误: 但如果我这样做,效果很好。 看起来cdef在Jupyter中的使用方式不同,我如何在Jupyter笔记本中使用cdef?