优化python效率的方法:1、时间复杂度优化算法;2、减少冗余数据;3.、合理使用copy和depcopy;4、使用dict或set搜索元素;5、生成器的合理使用(generator)和yield。
优化方法:
(推荐教程:Python入门教程)
1、时间复杂度优化算法
算法的时间复杂性对程序执行效率的影响可以通过选择合适的数据结构来优化Python中的时间复杂性,比如list和set找到某个元素的时间复杂性。(n)和O(1)。
2、减少冗余数据
比如用上三角或下三角来保存一个大的对称矩阵。稀疏矩阵用于0元素占大多数的矩阵。
3、合理使用copy和depcopy
对于dict和list等数据结构的对象,直接赋值采用参考方式。在某些情况下,整个对象需要复制。此时,可以使用copy包中的copy和deepcopy。这两个函数的区别在于后者是递归复制的。效率也不同:(以下程序在ipython中运行)
importcopy a=range(100000) %timeit-n10copy.copy(a)#copy运行10次.copy(a) %timeit-n10copy.deepcopy(a) 10lops,bestof3:1.55msperlooppop 10lops,bestof3:151msperloop
timeit后面的-n表示运行次数,后两行对应两个timeit的输出,下同。这说明后者慢一个数量级。
4、使用dict或set搜索元素
python 使用hash表实现dict和set(类似于c+11标准库中unordered_map),搜索元素的时间复杂度是O(1)
a=range(1000) s=set(a) d=dict((i,1)foriina) %timeit-n10000100ind %timeit-n10000100ins 一万lops,bestof3:43.5nsperloop 一万lops,bestof3:49.6nsperloop
dict的效率略高(占用更多空间)。
5、生成器的合理使用(generator)和yield
%timeit-n100a=(iforiinrange(100000)) %timeit-n100b=[iforiinrange(100000)] 100lops,bestof3:1.54msperlooppop 100lops,bestof3:4.56msperlooppop
使用()获得的是generator对象,所需的内存空间与列表的大小无关,因此效率会更高。在特定的应用程序中,如set(i for i in range(100000)会比set好([i for i in range(100000)快。
但对于需要循环遍历的情况:
%timeit-n10forxin(iforiinrange(100000)):pass %timeit-n10forxin[iforiinrange(100000)]:pass 10lops,bestof3:6.51msperlooppop 10lops,bestof3:5.54msperloopspop
后者效率更高,但如果循环中有break,使用generator的好处是显而易见的。yield也用于创建generator:
defyield_func(ls): foriinls: yieldi+1 defnot_yield_func(ls): return[i+1forinls] ls=range(1000000) %timeit-N10foriinyield_func(ls):pass %timeit-n10forinot_yield_func(ls):pass 10lops,bestof3:63.8msperloop 10lops,bestof3:62.9msperloop
对于内存不太大的list,可以直接返回一个list,但可读性yield更好(个人喜好)。
python2.xrange函数、itertols包等x内置generator功能。