用cProfile分析numpy没有给出有用的结果

时间:2013-12-06 21:39:35

标签: numpy cprofile

此代码:

import numpy as np
import cProfile

shp = (1000,1000)
a = np.ones(shp)
o = np.zeros(shp)

def main():
    np.divide(a,1,o)
    for i in xrange(20):
        np.multiply(a,2,o)
        np.add(a,1,o)

cProfile.run('main()')

仅打印:

         3 function calls in 0.269 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.269    0.269 <string>:1(<module>)
        1    0.269    0.269    0.269    0.269 testprof.py:8(main)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Prof
iler' objects}

我可以让cProfile与numpy合作,告诉我它对varous np.*来电有多少次调用以及每次调用花了多少时间?

修改

如hpaulj建议的那样单独包装每个numpy函数太麻烦了,所以我正在尝试这样的东西暂时包装许多或所有感兴趣的函数:

def wrapper(f, fn):
    def ff(*args, **kwargs):
        return f(*args, **kwargs)
    ff.__name__ = fn
    ff.func_name = fn
    return ff

for fn in 'divide add multiply'.split():
    f = getattr(np, fn)
    setattr(np, fn, wrapper(f, fn))

但是cProfile仍然将所有它们称为ff

1 个答案:

答案 0 :(得分:1)

如何在Python函数中包装相关调用?

def mul(*args):
    np.multiply(*args)
def add(*args):
    np.add(*args)

def main():
    np.divide(a,1,o)
    for i in xrange(20):
        mul(a,2,o)
        add(a,1,o)

这个SO线程基本上是关于改进性能分析粒度的想法 - 它描述了函数调用,而不是行。

Does effective Cython cProfiling imply writing many sub functions?