设为首页 收藏本站
查看: 1109|回复: 0

[经验分享] Performance tuning in Python

[复制链接]

尚未签到

发表于 2015-4-21 11:09:27 | 显示全部楼层 |阅读模式
  组内同事下午做了个关于python的小的share,觉得讲的还不错,将其中的Performance Tuning部分摘抄出来,供参考。
  首先,谨记高德纳老先生的名言:过早优化是万恶之源(Premature optimization is the root of all evil.)
  
  性能调优分问如下几步:


  • Find bottlenecks
  • Use better algorithms
  • Use faster tools
  • Write optimized code
  • Write your own python module
  • Parallezie the compution
  第一步是找出程序运行的性能瓶颈所在。python里提供了相应的工具,如Profile和cProfile。
  这里先给出一份描述更详尽的文章:关于Python Profiles性能分析器http://kb.iyunv.com/a/2337112/
  Profile是一个纯的python模块,而cProfile是用C语言写的一个python拓展。这里使用cProfile。
  (注:cProfile可能需要自行安装sudo apt-get install python-profiler)。
  给出一个待分析的程序profiler_demo.py:



1 #!/usr/bin/env python
2
3 above_limit = 10000001
4 def func1():
5     s = 0
6     for i in xrange(above_limit):
7         s += i
8
9 def func2():
10     s = sum(range(above_limit))
11
12 def func3():
13     s = sum(xrange(above_limit))
14
15 func1()
16 func2()
17 func3()
  在命令行执行python -m cProfile profiler_demo.py ,即可在运行程序的同时,得出程序的性能分析结果。



liuhao@liuhao-Lenovo:~/program/python$ python -m cProfile profiler_demo.py
8 function calls in 1.083 CPU seconds
Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1    0.000    0.000    0.101    0.101 profiler_demo.py:12(func3)
1    0.000    0.000    1.083    1.083 profiler_demo.py:3()
1    0.377    0.377    0.377    0.377 profiler_demo.py:4(func1)
1    0.153    0.153    0.604    0.604 profiler_demo.py:9(func2)
1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
1    0.289    0.289    0.289    0.289 {range}
2    0.263    0.131    0.263    0.131 {sum}
  对结果进行简单说明:
  1.从第一行可以看出,此Python脚本共包括8个函数调用,一共花费的CPU时间为1.083秒;
  2.ncalls为函数调用次数,tottime为函数本身不包含调用其他函数的执行时间,cumtime为总体函数的调用执行时间;
  3.cProfiler是基于lsprof的,从输出中标红的部分也可以看到;
  4.按照结果,我们知道func3是执行最快的;
  
  第二步,是选用更好的算法,在数据规模很大的时候,能够使用O(NlogN)的算法,就不要选用O(N^2)的算法;能够用(1+100)*100/2,就不要用sum(xrange(101));
  这里再给出一个使用Python提供的Decorator,利用空间换时间,计算Fibonacci数列的例子:
  程序如下:



1 def fib_nocache(n):
2     if n == 0 or n == 1:
3         return 1
4     return fib_nocache(n-2) + fib_nocache(n-1)
5
6 def cache(func):
7     c = {}
8     def _(n):
9         r = c.get(n)
10         if r is None:
11             r = c[n] = func(n)
12         return r
13     return _
14
15 @cache
16 def fib_cache(n):
17     if n == 0 or n == 1:
18         return 1
19     return fib_cache(n-2) + fib_cache(n-1)
20        
21 fib_nocache(32)
22 fib_cache(32)
  性能分析结果如下:



         7049317 function calls (69 primitive calls) in 2.305 CPU seconds
Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1    0.000    0.000    2.305    2.305 profiler_fib.py:1()
7049155/1    2.305    0.000    2.305    2.305 profiler_fib.py:1(fib_nocache)
33/1    0.000    0.000    0.000    0.000 profiler_fib.py:15(fib_cache)
1    0.000    0.000    0.000    0.000 profiler_fib.py:6(cache)
63/1    0.000    0.000    0.000    0.000 profiler_fib.py:8(_)
1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
63    0.000    0.000    0.000    0.000 {method 'get' of 'dict' objects}
  之前没有接触过Decorator,看到类似的写法还是蛮受用的。
  
  第三步,使用更好的工具。这里主要指Python中的一些惯用法,比如:


  • xrange()比range()更快;
  • itertools.imap()比map()更快;
  • dict.iteritems()比dict.items更快;
  • for i, item in enumerate(seq)比 for i in range(len(seq))更快;
  • etc
  
  第四步,写更好的代码,将好的算法和好的工具结合到一块;
  
  第五步和第六步,一个是将关键的模块用C来重写,一个是将原本串行的程序改成并行执行,都值得再单独写一篇博客,以后有空再慢慢写吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59183-1-1.html 上篇帖子: 应用Python在组件式GIS中集成地质统计学 下篇帖子: 一人一python挑战题解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表