①使用局部变量代替全局变量
如:s = os.linesep #优点简短标识便于维护,局部变量查找更快,能提高性能并节省内存;
②减少函数调用次数
对象类型判断时,采用isinstance()比较最优,对象类型身份(id())比较次子,采用(type())比较最次;
#如判定变量num是否为整数类型
isinstance(num, (int)) #调用一次函数
type(num) is type(0) #身份比较
type(num) == type(0) #调用三次函数
#不要把重复操作的内容作为参数放到循环条件中,避免重复运算
#每次循环都需要重新执行len(a)
while i < len(a):
statement
#len(a)仅执行一次
m = len(a)
while i < m:
statement
#使用X中的某个函数或对象Y时,应该直接用 from X import Y,而不是import X 或 import X.Y;
这样可以减少一次查询(解析器不必要首先查找X模块,然后在X模块的字典中查找Y)
③采用映射代替条件查找
#映射(比如dict等)的搜索速度远快于条件语句(比如if等)。
#if查找
if a == 1:
b = 10
elif a == 2:
b = 20
...
#dict查找,性能更优
d = {1:10, 2:20, ...}
b = d[a]
④直接迭代序列元素
对序列(str,list,tuple等),直接迭代序列元素,比迭代元素的索引速度更快。
a = [1, 2, 3]
#迭代元素
for item in a:
print(item)
#迭代索引
for i in range(len(a)):
print(a[i])
⑤采用生成器表达式代替列表解析
列表解析(list comprehension),会产生整个列表,对大量数据的迭代会产生负面效应.
而生成器表达式则不会,其不会真正创建列表,而返回一个生成器,在需要时产生一个值(延迟计算),对内存更加优化。
#计算文件f的非空字符个数
#列表解析
a = sum([i*i for i in range(6)])
#生成器表达式
b = sum(i*i for i in range(6))
⑥先编译后调用
# 使用eval(),exec()函数执行代码时,最好调用代码对象(提前通过compile()函数编译成字节码),而不是直接调用str,可以避免多次执行重复编译过程,提高程序性能
# 正则表达式模式模式匹配也类似,也最好先将正则表达式模式编译成regex对象(通过re.complie()函数),然后再执行比较和匹配
⑦模块编程习惯
#模块中的最高级别Python语句(没有缩进的代码)会在模块导入(import)时执行(不论其是否真的必要执行)。
因此,应尽量将模块所有的功能代码放到函数中,包括主程序相关的功能代码也可以放到main()函数中,主程序本身调用main()函数
#可以在模块的main()函数中书写测试代码。在主程序中,检测name的值,如果为'main'(表示模块是被直接执行),则调用main()函数,进行测试;
如果为模块名字(表示模块是被调用),则不进行测试
7个提升Python程序员的性能的好习惯
最新推荐文章于 2020-10-25 22:45:45 发布