профилирование 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, чтобы сообщить мне, сколько вызовов он делает для различных вызовов np.* и сколько времени он тратит на каждый?

изменить

Слишком громоздко обертывать каждую из функций numpy по отдельности, как предлагает hpaulj, поэтому я пытаюсь что-то вроде этого, чтобы временно обернуть многие или все интересующие функции:

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


person Paul    schedule 06.12.2013    source источник


Ответы (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 об улучшении детализации профилирования - он профилирует вызовы функций, а не строки.

Подразумевает ли эффективный Cython cProfiling написание множества подфункций?

person hpaulj    schedule 06.12.2013
comment
баллов, но это было бы слишком громоздко для моего профилирования в реальной жизни. Я попытался выполнить автоматическую обертку, но у меня не получилось (см. редактирование, если хотите). Я даже пробовал это: code.activestate.com/recipes/, но и там что-то не так. - person Paul; 07.12.2013