分析 Cython 代码时,啥是`stringsource`?

Posted

技术标签:

【中文标题】分析 Cython 代码时,啥是`stringsource`?【英文标题】:When profiling Cython Code, what is `stringsource`?分析 Cython 代码时,什么是`stringsource`? 【发布时间】:2014-01-11 00:00:20 【问题描述】:

我正在尝试优化一个繁重的 Cython 函数。我正在按照以下教程 http://docs.cython.org/src/tutorial/profiling_tutorial.html 进行分析。我的配置文件输出如下所示:

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    7.521    7.521   18.945   18.945 routing_cython_core.pyx:674(resolve_flat_regions_for_drainage)
  6189250    4.964    0.000    4.964    0.000 stringsource:323(__cinit__)
  6189250    2.978    0.000    7.942    0.000 stringsource:618(memoryview_cwrapper)
  6009849    0.868    0.000    0.868    0.000 routing_cython_core.pyx:630(_is_flat)
  6189250    0.838    0.000    0.838    0.000 stringsource:345(__dealloc__)
  6189250    0.527    0.000    0.527    0.000 stringsource:624(memoryview_check)
  1804189    0.507    0.000    0.683    0.000 routing_cython_core.pyx:646(_is_sink)
    15141    0.378    0.000    0.378    0.000 _gdal_array.BandRasterIONumPy
        3    0.066    0.022    0.086    0.029 /home/rpsharp/local/workspace/invest-natcap.invest-3/invest_natcap/raster_utils.py:235(new_raster_from_base_uri)
    11763    0.048    0.000    0.395    0.000 /usr/lib/python2.7/dist-packages/osgeo/gdal_array.py:189(BandReadAsArray)

特别是我对多次调用stringsource:323(__cinit__)stringsource:618(memoryview_cwrapper) 的第2 行和第3 行感兴趣。尽管我正在静态键入 numpy 数组,但 Google 发现了对我没有在该函数中使用的内存视图的引用。知道这些调用是什么,是否可以避免/优化它们?

【问题讨论】:

【参考方案1】:

好吧,原来我确实有记忆视图。我正在调用一个内联函数,该函数将一个静态类型的 numpy 数组传递给内存视图,从而调用了对 stringsource 的所有额外调用。用 numpy 类型替换函数调用中的 memoryview 类型修复了这个问题。

【讨论】:

以上是关于分析 Cython 代码时,啥是`stringsource`?的主要内容,如果未能解决你的问题,请参考以下文章

为整个程序启用 Cython 分析?

Cython 似乎通过减少时间分析器而不是核心代码的开销来提供加速?

使用 Cython 的 Line Profiling 内部函数

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

Cython:pyximport:在 pyximport.install 中启用分析

Cython保护python代码