一.原则类
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)
结果输出所有符合项的列表集合。