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

标签 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.* 进行了多少次调用吗?调用以及在每个调用上花费多少时间?

编辑

像 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

最佳答案

将相关调用包装在 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?

关于numpy - 使用 cProfile 分析 numpy 没有给出有用的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20434042/

相关文章:

python - 将新列添加到矩阵(数组)列表

python - set_axis() 获得参数 'axis' 的多个值

python - 从 .csv 文件中读取值并将它们转换为 float 组

python - 我应该使用什么工具来分析 Windows 7 上的 Python 代码

python - 如何使用机器学习在 python 中根据给定的一组地理数据进行预测?

python - {built-in method select} 在 Python 3 中做什么?

python - 分析简单的 python 脚本

python - 无法弄清楚如何在程序内部调用 cProfile

python - 如何计算python中线上两点之间的距离