python提高效率(优化)的心得总结
Posted 卖山楂啦prss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python提高效率(优化)的心得总结相关的知识,希望对你有一定的参考价值。
转载自:python提高效率(优化)的心得总结
作者:Capricorn.python
用python也有小两年了,不是开发,所以代码应该没那么精湛。但是经常会写测试脚本和小工具。在积累了大量的库以后,开始把重点放在提高python效率的方法,养成好的习惯。因为是刚刚开始关注,所以不断补充吧,以便将来随时查看。
一、原则类
1.把range
全部换成xrange
2.生成器,如 list=(item for item in fp)
3.利用psyco库,提高函数和类的运行效率。
4.字符串拼接:尽量少用“+”的方式,而采用’’.join ,还有"%s"%i这样赋值的手段
5.函数的开销很大。尽量把循环放在函数内进行。而不要让每次迭代都调用函数。
6.“前提工作”先做好,比如该赋值,该拼接的,然后再引入到函数中,或者进行下面的循环。
7.尽量使用内置方法,因为内置的是C写的,效率肯定高很多
8.每当要对序列中的内容进行循环处理时,就应当尝试用列表解析来代替它,如:[i for i in xrang(10) if i%2==0]
9.学会使用itertools模块。当python中添加了迭代器后,就为常见模式提供了一个新的模块,因为它是以C语言编写,所以提供了最高效的迭代器。
–多记录一些。列表,字符串,字典,xrange,类文件对象,这些都是可迭代对象,换句话说,都可以直接用在for循环中进行迭代,如for item in open('1.txt')
–直接使用速度会快。另外,我对比了itertools里工具和xrange,比如都循环100000次打印数字,使用islice(count(),100000)
均要比xrange(100000)
快
–而xrange
还要比range
快。
10.用列表解析取代for循环。列表解析的效率等于或高于map。
11.垃圾回收机制,会对列表的操作有重大影响,如列表的append,或者列表解析。import gc,然后在数据载入模块前gc.disable()
,结束后再gc.enable()
。
二、应用类
1.列表推导
如果想复制一个列表或者字典,直接使用L1=list(L),d1 = dict(d).
而不要使用列表推导。
如果想对列表的每一个元素都调用函数,应该用L1=map(f,L)
,而不是L1=[f(x) for x in L]
当序列过长,每次只需要读取一个元素的时候,应该用生成器,而不是列表推导。total=sum(x+23 for x in lodlist if x >5)
2.从文件中读取指定的行
标准库linecache非常适合这个任务:
import linecache
theline = linecache.getline(thefilepath,desired_line_number)
如果文件很大,则应该使用显示的循环,并封装在一个函数中:
def getline(thefilepath,desired_line_number):
if desired_line_number < 1:return ''
for current_line_number,line in enumerate(open(thefilepath,'rU')):
if current_line_number == desired_line_number-1:
return line
return ''
3.何时用列表推导or生成器表达式
如果你希望使用整个列表,则使用列表推导,因为他会节省生成器带来的系统开销;
如果你只想用列表的一部分,那么使用生成器吧。
4.随机取出列表里的元素
应该先用random.shuffle(list)把元素随机的打乱,然后顺序的取每一项即可。如果不想取到重复的,可以用list.pop(),既取出来了,又把这个元素从列表中删除。而且内置的pop方法,非常快速。
我希望python进阶。但在这之前,我还要修饰一下边幅,上面所述的,就是在美化你的python程序。完成一个功能时,尽可能简洁,不罗嗦,每个细节提前考虑优化。脚本耦合性太强也会影响效率。
不断补充吧。
三、文本处理
文本处理,字符串处理,应该是平时用的非常多的,这里也有优化技巧。
1.习惯用filter或map
fp = open('1.txt','rb')
isRegDBRoot = lambda line:line.startswith('RegDB Root')
#or
isRegDBRoot = lambda line:'Start' in line
a = filter(isRegDBRoot,fp)
结果输出所有符合项的列表集合。
以上是关于python提高效率(优化)的心得总结的主要内容,如果未能解决你的问题,请参考以下文章