提升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使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
Jun 13 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
对Python函数设计规范详解
Jul 19 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
如何在python中实现随机选择
Nov 02 Python
Python socket聊天脚本代码实例
Jan 02 Python
Django模板标签中url使用详解(url跳转到指定页面)
Mar 19 Python
Python 日期与时间转换的方法
Aug 01 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 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
PHP调用三种数据库的方法(2)
2006/10/09 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
php若干单维数组遍历方法的比较
2011/09/20 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
php session的锁和并发
2016/01/22 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
在Python中操作文件之read()方法的使用教程
2015/05/24 Python
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
Python使用struct处理二进制的实例详解
2017/09/11 Python
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
特步官方商城:Xtep
2017/03/21 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
文秘自荐信
2013/10/20 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
超市开业庆典活动策划方案
2014/09/15 职场文书
电工实训报告总结
2014/11/05 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
欧元符号 €
2022/02/17 杂记
对讲机的最大通讯距离是多少
2022/02/18 无线电