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)