在分析Cython代码时,什么是`stringsource`?

时间:2014-01-11 00:00:20

标签: python profiling cython

我有一个很重的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)

具体来说,我对第2和第3行感兴趣,它们多次调用stringsource:323(__cinit__)stringsource:618(memoryview_cwrapper)。谷歌出现了对我在该功能中没有使用的内存视图的引用,尽管我静态地输入了numpy数组。知道这些电话是什么,我是否可以避免/优化它们?

1 个答案:

答案 0 :(得分:1)

好的,事实证明我 有内存视图。我正在调用一个内联函数,它将一个静态类型的numpy数组传递给一个内存视图,从而调用所有对stringsource的额外调用。用numpy类型替换函数调用中的memoryview类型修复了这个。