如何使用 IPython %lprun 魔术函数分析类方法
Posted
技术标签:
【中文标题】如何使用 IPython %lprun 魔术函数分析类方法【英文标题】:how profiling class method using IPython %lprun magic function 【发布时间】:2018-03-06 17:29:33 【问题描述】:如何分析函数内部调用的对象的方法?我在 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】:TL;DR:在 %lprun -f foo.compute my_func()
中使用 foo,not my_foo 与您的示例一样。
鉴于当前示例,您可以像这样分析您的类和方法:
%load_ext line_profiler
分析您调用类的函数:%lprun -f my_func my_func()
,它返回:
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)
-
然后,经过检查,您会发现大部分时间都花在了您的方法
my_foo.compute()
中。 my_foo
是 foo
类的一个实例,因此您可以进行更进一步、更具体的分析器调用 %lprun -f foo.compute my_func()
,它会返回:
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
【讨论】:
以上是关于如何使用 IPython %lprun 魔术函数分析类方法的主要内容,如果未能解决你的问题,请参考以下文章