python高性能编程学习笔记

python高性能编程学习笔记

代码执行时间检测方法:
1、python的time模块:time.time()
2、Ipython的魔法函数:%timeit
3、Linux系统自带的time命令:/usr/bin/time
4、Cprofile:
作用:来测量每一个函数运行所花费的时间。
用法参考:python -m cprofile -s cumulative xxx.py
可以使用[-o 文件名称]指定统计输出文件,并可以使用pstates模块来查看统计结 果:import pstates ;p=pstates.states(‘统计输出文件名称’) 来读取统计文件并查 看。
Runsnake 可以对cprofile的结果进行可视化显示
5、line_profile:
对函数进行逐行分析,统计每行代码的运行时间。
用法参考:在代码中使用@profile修饰要检测的函数,使用命令:
kernprof -l -v xxx.py 其中:-l表示逐行检测,-v表示显示输出

代码内存占用情况的检测:
6、memory_profile:
逐行测试内存的占用情况。
用法参考:在代码中使用@profile修饰要检测的函数,使用命令:
Python -m memory_profile xxx.py 可以使用mprof显示内存的使用情况
也可以使用%load_ext memory_profiler 导入%memit 魔法方法,在python shell中交互式测试代码的内存使用情况。
7、heap:
查看内存堆上的对象的数量以及每个对象的大小
用法参考: pip install gappy 安装gappy模块
hp=gappy.hpy(); hp.heap(); 也可使用hp.setrealheap()设置节点
8、dower:
可以在代码运行时钩入命名空间,可以在web服务器上提供一个实时的变量实例图。需要安装cherrpy模块。

其他的一些检测技巧
9、dis:
使用dis模块我们可以查看代码在cpython虚拟机中的字节码。
用法参考:import dis;dis.dis(’…’) 可以给他传递一段代码或一个模块
10、coverage:
代码测试覆盖程度的检测,会检测哪些代码被测试覆盖,哪些没有被覆盖。
11、no_op:
如果代码中使用了@profile修饰器,来进行line_profiler或memory_profiler测试,那么
在进行单元测试的时候会报错找不到profile修饰器,这时就需要自建一个修饰器。
如下:
if ‘builtin’ not in dir() or not hasattr(builtin,’profile’): #line_profiler
if ‘builtin’ not in dir() : #memory_profiler
def profile(func):
def inner(*args,**kwargs):
retuen func(*args,**kwargs)
return inner
12、Linux系统命令 perf:
Perf是linux系统下的一个软件性能分析工具,通过使用perf可以查看代码运行过程中cpu指令等信息的具体情况。

如何提高代码的性能:
13、bisect:
bisect.bisect() 创建一个有序的列表,可以动态的插入和删除,可以快速查询列表的中元素。
14、numexpr:
支持numpy的计算表达式,能优化numpy计算数据的缓存。
用法参考:numexpr.evalute()

编译python代码:
将python代码编译后再执行,可获得较大的速度提升,下边列举一些python代码的
编译工具。
15、Cython:
可将一个类型注解(cdef)的python代码编译为一个python扩展模块(支持openMP
和numpy),通过使用 cython -a xxx.pyx 可生成一个编译分析文件,使用浏览器查看具体的python虚拟机调用情况,其中颜色越黄表示有越多的python虚拟机调用。
用法参考:setup.py文件编辑
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(cmdclass={‘build_ext’:build_ext,ext_modules=[Extension(‘xxxx’,[‘xxx.pyx’])]})

编辑好setup.py文件后,执行如下命令对对应的python代码进项编译,
python setup build_ext --inplace

16、shed skin(python2.4-2.7):
Shed skin可以自动完成python代码的类型注解,被注解的python代码可以接着被编译为c代码,然后可以采用gcc之类的编译器进行编译。同时shedskin可以构建独立的可执行程序也可以构建python的扩展模块。
用法参考:shedskin -ann xxx.py 提供一个python代码的注解输出
shedskin --extmod xxx.py 生成对应的c代码和makefile文件,可用make命令直接编译。
17、numba:
针对numpy计算的JIT优化。
用法参考:from numba import jit
@jit
def xxx(*args,**kwargs):
…(一些和numpy相关的计算)
18、pythran:
Pythran是一个可以把python代码代码编译为c++代码的编译器,我们需注解一个函数的参数类型,然后它会接管进一步的类型注解。
用法参考:在python代码中使用 #pythran export func_name(参数1的类型…,参数2的类型),使用# omp parrallel for schedule(guided) 来注解声明并行执行。
然后使用,pythran xxx.py 来对该python代码进行编译,输出xxx.so文件。
19、pypy:
Pypy是一个即使编译器,支持所有python的内置模块,是python语言的一个替代实现。

python外部语言接口:
外部函数接口可以让我们的python代码去调用访问其他语言编写和编译的代码。
20、ctypes:
ctypes模块是python最基本的一个外部函数接口模块。
21、cffi:
Cffi自动对函数和结构体进行解释和完成类型转换,同时支持即时编写的一段c代码(ffi.verify())
22、f2py:
f2py提供了一个非常简单的把Fortran代码导入带python的方法,所有的Fortran代码都和f2py兼容。
用法参考:使用!f2py 注解Fortran的代码xxx.f,如下
!f2py threadsafe
!f2py intent(in) grid

然后使用 f2py -c -m xxx --fcompiler=gfortran --opt=’-o3’ xxx.f 生成xxx.so ,python可以直接导入使用。
23、Cpython:
用法参考:1编写对应的c代码 2编辑setup.py文件 3 编译

异步并发和并行分布:
可使用的模块有:gevent、grequest、tornado、asyncio、aiohttp
24、Multiprocessing:
Multiprocessing 多进程
之间的通讯,可以使用 Manager、Redis外部系统、mmap内存映射、multiprocessing.queue等方式,同时修改文件和某个数值时,为防止错误,要使用文件所filelock或multiprocessing.lock。
28、Threading:
Threading 多线程模块
Multiprocessing.dummy multiprocessing中的多线程模块
具体使用方法可参考多进程的过程。要注意的是,python具有GIL全局锁限制,也就是
说同一时间python解释器只能对一个线程命令进行解释,结果就是不同的线程交替在
执行,二没有同时执行。
25、集群:
Python集群的三个方案:parallel python(pp模块)、Ipython parallel(pcluster) 、nsq(一个高性能的分布式消息平台)

使用更少的RAM:
减少RAM的使用可使用的方法,使用array或numpy,对特的数据使用特定的容器、以精度来换取空间(概率计数)。
数据容器:dawg、marisa_trie、datrie、hat_trie、bisect、set、dict、blist(排序集合&排序词典)
以精度来换取空间:主要在countmemaybe 模块中,有morris计数器、k最小值(KMinValues)计数器、布隆过滤(BoolmFilter)、loglog计算器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值