Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4564856
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: Python/Ruby

2020-10-30 10:09:08

https://blog.csdn.net/guofangxiandaihua/article/details/77825524

python性能调试过程中最突出的问题就是耗时,性能测试工具有很多,像profiler,cprofiler等等,都是只能返回函数整体的耗时,而line_profiler就能够很好解决这个问题(大家可以试试就知道了)。

怎么使用这个工具呢?网上大部分都是说在所需要测的函数前面加一个@profile,如文档所说。但是加了@profile后函数无法直接运行,只能优化的时候加上,调试的时候又得去掉。文章中提到了这个问题的解决办法,个人觉得还是有点麻烦,不太能理解这是为什么。我在stackoverflow上看到了另一种关于line_profile的使用方法,简单而且实用。

这是使用案例:

  1. from line_profiler import LineProfiler
  2. import random
  3. def do_stuff(numbers):
  4. s = sum(numbers)
  5. l = [numbers[i]/43 for i in range(len(numbers))]
  6. m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
  7. numbers = [random.randint(1,100) for i in range(1000)]
  8. lp = LineProfiler()
  9. lp_wrapper = lp(do_stuff)
  10. lp_wrapper(numbers)
  11. lp.print_stats()
输出结果:


  1. Timer unit: 1e-06 s
  2. Total time: 0.000649 s
  3. File: <ipython-input-2-2e060b054fea>
  4. Function: do_stuff at line 4
  5. Line # Hits Time Per Hit % Time Line Contents
  6. ==============================================================
  7. 4 def do_stuff(numbers):
  8. 5 1 10 10.0 1.5 s = sum(numbers)
  9. 6 1 186 186.0 28.7 l = [numbers[i]/43 for i in range(len(numbers))]
  10. 7 1 453 453.0 69.8 m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
这种方法就比较好用了,如果你想在其他文件中调用这个包含line_profiler函数测试的文件,又不想把这个信息显示出来,使用


if __name__ == '__main__':
把需要测试的函数放到这个下面,这样就能完美解决上述问题。



对于函数内部调用函数的情况:

  1. from line_profiler import LineProfiler
  2. import random
  3. def do_other_stuff(numbers):
  4. s = sum(numbers)
  5. def do_stuff(numbers):
  6. do_other_stuff(numbers)
  7. l = [numbers[i]/43 for i in range(len(numbers))]
  8. m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
  9. numbers = [random.randint(1,100) for i in range(1000)]
  10. lp = LineProfiler()
  11. lp_wrapper = lp(do_stuff)
  12. lp_wrapper(numbers)
  13. lp.print_stats()
这样做的话,只能显示子函数的总时间。输出如下:


  1. Timer unit: 1e-06 s
  2. Total time: 0.000773 s
  3. File: <ipython-input-3-ec0394d0a501>
  4. Function: do_stuff at line 7
  5. Line # Hits Time Per Hit % Time Line Contents
  6. ==============================================================
  7. 7 def do_stuff(numbers):
  8. 8 1 11 11.0 1.4 do_other_stuff(numbers)
  9. 9 1 236 236.0 30.5 l = [numbers[i]/43 for i in range(len(numbers))]
  10. 10 1 526 526.0 68.0 m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
为了能够同时显示函数每行所用时间和调用函数每行所用时间,加入add_function就能够解决。


  1. from line_profiler import LineProfiler
  2. import random
  3. def do_other_stuff(numbers):
  4. s = sum(numbers)
  5. def do_stuff(numbers):
  6. do_other_stuff(numbers)
  7. l = [numbers[i]/43 for i in range(len(numbers))]
  8. m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
  9. numbers = [random.randint(1,100) for i in range(1000)]
  10. lp = LineProfiler()
  11. lp.add_function(do_other_stuff) # add additional function to profile
  12. lp_wrapper = lp(do_stuff)
  13. lp_wrapper(numbers)
  14. lp.print_stats()
  1. Timer unit: 1e-06 s
  2. Total time: 9e-06 s
  3. File: <ipython-input-4-dae73707787c>
  4. Function: do_other_stuff at line 4
  5. Line # Hits Time Per Hit % Time Line Contents
  6. ==============================================================
  7. 4 def do_other_stuff(numbers):
  8. 5 1 9 9.0 100.0 s = sum(numbers)
  9. Total time: 0.000694 s
  10. File: <ipython-input-4-dae73707787c>
  11. Function: do_stuff at line 7
  12. Line # Hits Time Per Hit % Time Line Contents
  13. ==============================================================
  14. 7 def do_stuff(numbers):
  15. 8 1 12 12.0 1.7 do_other_stuff(numbers)
  16. 9 1 208 208.0 30.0 l = [numbers[i]/43 for i in range(len(numbers))]
  17. 10 1 474 474.0 68.3 m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
结束
阅读(925) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~