这篇文章python性能优化总结的比较好,可以先看这篇的介绍。
里面介绍了针对不同场景使用的工具,
对于python程序,比较出名的profile工具有三个:profile、cprofile和hotshot。
其中profile是纯python语言实现的,Cprofile将profile的部分实现native化,hotshot也是C语言实现,hotshot与Cprofile的区别在于:hotshot对目标代码的运行影响较小,代价是更多的后处理时间,而且hotshot已经停止维护了。需要注意的是,profile(Cprofile hotshot)只适合单线程的python程序。
对于多线程,可以使用yappi,yappi不仅支持多线程,还可以精确到CPU时间
对于协程(greenlet),可以使用greenletprofiler,基于yappi修改,用greenlet context hook住thread context。
profile的结果可以用gprof2dot生成函数调用开销图,进行分析。
这里介绍另外一个好用的工具pyflame。对单线程,多线程,协程支持都很好,使用简单,不用修改源码,直接profile运行的进程。效率较高,进程运行只会慢3倍左右,建议非线上环境使用。最最关键的是可以直接生成火焰图,具体介绍可以看github链接pyflame。
火焰图怎么看先google学习下,比gprof2dot的图更清晰明了。
pyflame的安装步骤在github上介绍的很详细,对centos7也是适用的。这里介绍下内核较老的centos6+python2.6下面的安装(是一个C API 缺失setns)。
- 下载源码,
git clone https://github.com/faicker/pyflame
安装编译环境(高版本gcc和autoconf)及依赖包,
12345yum install centos-release-sclyum install devtoolset-3-gcc devtoolset-3-gcc-c++rpm -ivh https://www.softwarecollections.org/en/scls/praiskup/autotools/epel-6-x86_64/download/praiskup-autotools-epel-6-x86_64.noarch.rpmyum install autotools-latestyum install python-devel编辑文件
/usr/lib64/pkgconfig/python2.pc
1234567891011prefix=/usrexec_prefix=/usrlibdir=/usr/lib64includedir=/usr/includeName: PythonDescription: Python libraryRequires:Version: 2.6Libs.private: -lpthread -ldl -lutilLibs: -L${libdir} -lpython2.6Cflags: -I${includedir}/python2.6编译,
12345scl enable devtoolset-3 bashscl enable autotools-latest bash./autogen.sh./configuremakepyflame -s 10 12345 | flamegraph.pl > myprofile.svg
Enjoy.
注意点:
- profile eventlet程序时,要把pyflame结果里出现次数最多(比采样次数还多)的tpool.py:tworker:75的堆栈删掉。
- svg文件可以用浏览器比如chrome打开。
- 官方版本已经把centos6的支持合进去了(centos 6可以用1.5.2,后面的版本有点问题)