python编程效率注意事项
时间:2007-04-17 来源:ima
名字空间使用
由于python是运行的时候确定变量的位置,所以在运行的时候要做名字解析,依次是最内层(局部变量),中层(调用栈,当前模块),最外层(内置对象)。对于“."操作符号,“self.val”的引用方式比“val=self.val,val”慢了一成。
对于import 操作符,import os与,from os import listdir,在频繁使用listdir的情况下,后者的速度快的多.
造成这种区别的原因是python的名字解析机制,每个层次都会有自己的名字字典.对于频繁使用的对象,应该将其名字倒入到最内层名子字典
要点:尽量减少名字解析的运算复杂度,适当使用别名和import;利用global 改变变量的属性
对象的正确使用
在对变量进行可变操作时,选择适当的方式,可以避免许多无效的工作。比如 对于str类型,其本身是不可变的,任何的可变操作都会导致新对象的产生,所以类似
strarr=["a","b","c","d"];
joinstr='';
for s in strarr:joinstr+=s;
执行的效率很低,生成了 a+b,a+b+c的副本。
简单的办法是,joinstr=''.join(strarr);
这个对于批量的串操作很有意义.可以将处理过程中生成的串以列表形式存放,最终使用join方法合并
对少量的串的合并,可以用
joinstr=(%s%s%s)%(strarr[0],strarr[1],strarr[2]);
减少副本的生成
减少判断的方法
对于某些少量出现的异常,用处理异常的方式比每次都作判断强的多。这个类似c中的case语句的顺序,可以根据各种情况的概率确定合适的方法
参数的使用
尽量减少传递参数的规模,python是值传递的,大量的参数会导致额外的工作量性能诊断工具
import profile;profile.run('函数名()');
会打印出函数调用次数以及时间
time模块的time()取得时间
###<<dive into python >> 建议不要用自己的记时函数
timeit
import timeit
t=timeit.Timer("cmd","import modules")
t.timeit([runtimes,default is 1000000])
t.repeat(round,times)
输出某条语句 执行设定次数的耗时
相关阅读 更多 +