提升Python程序性能的7个习惯


Posted in Python onApril 14, 2019

掌握一些技巧,可尽量提高Python程序性能,也可以避免不必要的资源浪费。

1、使用局部变量

尽量使用局部变量代替全局变量:便于维护,提高性能并节省内存。

使用局部变量替换模块名字空间中的变量,例如 ls = os.linesep。一方面可以提高程序性能,局部变量查找速度更快;另一方面可用简短标识符替代冗长的模块变量,提高可读性。

2、减少函数调用次数

对象类型判断时,采用isinstance()最优,采用对象类型身份(id())次之,采用对象值(type())比较最次。

判断变量num是否为整数类型

type(num) == type(
0
) 
#调用三次函数
type(num) 
is
 type(
0
) 
#身份比较
isinstance(num,(
int
)) 
#调用一次函数

不要在重复操作的内容作为参数放到循环条件中,避免重复运算。

#每次循环都需要重新执行len(a)
while
 i < len(a):
 statement
#len(a)仅执行一次
m = len(a)
while
 i < m:
 statement

如需使用模块X中的某个函数或对象Y,应直接使用from X import Y,而不是import X; X.Y。这样在使用Y时,可以减少一次查询(解释器不必首先查找到X模块,然后在X模块的字典中查找Y)。

3、采用映射替代条件查找

映射(比如dict等)的搜索速度远快于条件语句(如if等)。Python中也没有select-case语句。

#if查找
if
 a == 
1
:
 b = 
10
elif
 a == 
2
:
 b = 
20
...
#dict查找,性能更优
d = {
1
:
10
,
2
:
20
,...}
b = d[a]

4、直接迭代序列元素

对序列(str、list、tuple等),直接迭代序列元素,比迭代元素的索引速度要更快。

a = [
1
,
2
,
3
]
#迭代元素
for
 item 
in
 a:
print
(item)
#迭代索引
for
 i 
in
 range(len(a)):
print
(a[i])

5、采用生成器表达式替代列表解析

列表解析(list comprehension),会产生整个列表,对大量数据的迭代会产生负面效应。

而生成器表达式则不会,其不会真正创建列表,而是返回一个生成器,在需要时产生一个值(延迟计算),对内存更加友好。

#计算文件f的非空字符个数
#生成器表达式
l = sum([len(word) 
for
 line 
in
 f 
for
 word 
in
 line.split()])
#列表解析
l = sum(len(word) 
for
 line 
in
 f 
for
 word 
in
 line.split())

6、先编译后调用

使用eval()、exec()函数执行代码时,最好调用代码对象(提前通过compile()函数编译成字节码),而不是直接调用str,可以避免多次执行重复编译过程,提高程序性能。

正则表达式模式匹配也类似,也最好先将正则表达式模式编译成regex对象(通过re.complie()函数),然后再执行比较和匹配。

7、模块编程习惯

模块中的最高级别Python语句(没有缩进的代码)会在模块导入(import)时执行(不论其是否真的必要执行)。因此,应尽量将模块所有的功能代码放到函数中,包括主程序相关的功能代码也可放到main()函数中,主程序本身调用main()函数。

可以在模块的main()函数中书写测试代码。在主程序中,检测name的值,如果为'main'(表示模块是被直接执行),则调用main()函数,进行测试;如果为模块名字(表示模块是被调用),则不进行测试。

总结

以上所述是小编给大家介绍的提升Python程序性能的7个习惯,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
python使用Berkeley DB数据库实例
Sep 26 Python
Python中实现对list做减法操作介绍
Jan 09 Python
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Tensorflow之Saver的用法详解
Apr 23 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
TensorFlow实现iris数据集线性回归
Sep 07 Python
python装饰器相当于函数的调用方式
Dec 27 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 Python
Python requests.post方法中data与json参数区别详解
Apr 30 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Nov 11 Python
Python根据当前日期取去年同星期日期
Apr 14 #Python
Python实现的微信支付方式总结【三种方式】
Apr 13 #Python
Python实现合并excel表格的方法分析
Apr 13 #Python
Python Image模块基本图像处理操作小结
Apr 13 #Python
python使用pymongo操作mongo的完整步骤
Apr 13 #Python
Python实现去除图片中指定颜色的像素功能示例
Apr 13 #Python
python mac下安装虚拟环境的图文教程
Apr 12 #Python
You might like
根德YB400的电路分析
2021/03/02 无线电
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
vue实现简单图片上传
2020/06/30 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Python的Flask框架的简介和安装方法
2015/11/13 Python
Python找出list中最常出现元素的方法
2016/06/14 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
python如何导入依赖包
2020/07/13 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
写自招自荐信的绝招!
2019/04/19 职场文书
java调用Restful接口的三种方法
2021/08/23 Java/Android
Python如何让字典保持有序排列
2022/04/29 Python
详解MySQL的内连接和外连接
2023/05/08 MySQL