
使用python进入一个熟练的状态之后就会思考提升代码的性能,尤其是python的执行效率还有很大提升空间(委婉的说法)。面对提升效率这个话题,python自身提供了很多高性能模块,很多大牛开发出了高效第三方包,可谓是百花齐放。下面根据我个人使用总结出提升性能的几个层面和相关方法。
python代码优化:
需要迭代出大量数据的场景,不需要将所有数据创建出来,合理使用生成器减少内存消耗
items_gen = (i for i in range(5000))>>> items_gen.__sizeof__()96items_list = [i for i in ragne(5000)]>>> items_list.__sizeof__()43016详细使用参见另一篇专门讲collections的文章 Python原生数据结构增强模块collections
详细使用参见另一篇专门讲itertools的文章Python高性能工具迭代标准库itertools
array 模块是python中实现的一种高效的数组存储类型。
它和list相似,但是所有的数组成员必须是同一种类型,在创建数组的时候,就确定了数组的类型。
functools.lru_cache 对函数做缓存
lru_cache 是一个装饰器,为函数提供缓存功能。被装饰的函数以相同参数调用时直接返回上一次的结果。不做缓存
import time def fibonacci(n): """斐波那契函数""" if n < 2: return n return fibonacci(n - 2) + fibonacci(n - 1)start = time.time()res = fibonacci(40)end = time.time()print(res)print(end - start)10233415532.14816737174988做缓存
import timefrom functools import lru_cache @lru_cachedef fibonacci(n): """斐波那契函数""" if n < 2: return n return fibonacci(n - 2) + fibonacci(n - 1)start = time.time()res = fibonacci(40)end = time.time()print(res)print(end - start)1023341550.00020623207092285156使用注意:
python 代码的执行过程为:
python慢的原因主要是因为解释器。解决办法有两个:
一是解决办法是使用C/C++语言重写Python函数,但是这要求程序员对C/C++语言熟悉,且调试速度慢,不适合绝大多数Python程序员。
另外一种非常方便快捷的解决办法就是使用Just-In-Time(JIT)技术。
Just-In-Time(JIT)技术为解释语言提供了一种优化,它能克服上述效率问题,极大提升代码执行速度,同时保留Python语言的易用性。使用JIT技术时,JIT编译器将Python源代码编译成机器直接可以执行的机器语言,并可以直接在CPU等硬件上运行。这样就跳过了原来的虚拟机,执行速度几乎与用C语言编程速度并无二致。
Numba是一个针对Python的开源JIT编译器,由Anaconda公司主导开发,可以对Python原生代码进行CPU和GPU加速。
import timedef fun(x): total = 0 start = time.time() for i in range(1,x+1): total += i end = time.time() print(total) print(end - start)fun(100000000)50000000500000005.934630393981934import timefrom numba import jit, int32@jit(int32(int32))def fun(x): total = 0 start = time.time() for i in range(1,x+1): total += i end = time.time() print(total) print(end - start)fun(100000000)50000000500000000.1186532974243164速度有60倍提升