如何使用IPython%lprun魔术函数分析类方法

时间:2018-03-06 17:29:34

标签: python class ipython profiling jupyter-notebook

如何分析函数内部调用的对象的方法?我在jupyter笔记本中使用%lprun魔法。请参阅以下ex.py示例文件:

class foo():
    def __init__(self, a=0, n=1):
                self.a=a
                self.n=n

    def compute(self):
        result = 0
        for i in range(self.n):
            result += self.a
        return result 

def my_func():
    a = 1
    n = 1000
    my_foo = foo(a, n)
    result = my_foo.compute()
    print(result)

然后,从我的jupyter笔记本中,我可以描述my_func

 from ex import my_func

 %lprun -f my_func my_func()

但我无法描述我的compute方法:

from ex import my_func

%lprun -f my_foo.compute my_func()

我想要的甚至可能吗?我如何填充-f参数中的类方法才能使其工作?

根据documentation,“cProfile只调用显式函数调用次数,而不是因语法而调用的特殊方法”,......所以它应该可以工作。

我发现的一个(可能)相关问题is here

1 个答案:

答案 0 :(得分:1)

TL; DR:在%lprun -f foo.compute my_func()中使用 foo my_foo ,如示例所示。

根据当前示例,您可以对您的类和方法进行分析:

  1. %load_ext line_profiler

  2. 说明您调用班级的函数:%lprun -f my_func my_func(),它返回:

  3. Timer unit: 1e-06 s
    
    Total time: 0.000363 s
    File: <ipython-input-111-dedac733c95b>
    Function: my_func at line 12
    
    Line #      Hits         Time  Per Hit   % Time  Line Contents
    ==============================================================
        12                                           def my_func():
        13         1          2.0      2.0      0.6      a = 1
        14         1          1.0      1.0      0.3      n = 1000
        15         1          4.0      4.0      1.1      my_foo = foo(a, n)
        16         1        278.0    278.0     76.6      result = my_foo.compute()
        17         1         78.0     78.0     21.5      print(result)
    
    1. 然后,经过检查,您会发现大部分时间都花在您的方法my_foo.compute()中。 my_foofoo类的一个实例,因此您可以进行更具体的探查器调用%lprun -f foo.compute my_func(),它将返回:
    2. Timer unit: 1e-06 s
      
      Total time: 0.001566 s
      File: <ipython-input-12-e96be9cf3108>
      Function: compute at line 6
      
      Line #      Hits         Time  Per Hit   % Time  Line Contents
      ==============================================================
           6                                               def compute(self):
           7         1          3.0      3.0      0.2          result = 0
           8      1001        765.0      0.8     48.9          for i in range(self.n):
           9      1000        797.0      0.8     50.9              result += self.a
          10         1          1.0      1.0      0.1          return result