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

1、使用局部变量

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

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

2、减少函数调用次数

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

# 判断变量num是否为整数类型
type(num) == type(0)  #调用三次函数
type(num) is type(0)  #身份比较
isinstance(num,(int)) #调用一次函数
提升Python程序性能的7个习惯

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

# 每次循环都需要重新执行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()函数,进行测试;如果为模块名字(表示模块是被调用),则不进行测试。

原创文章,作者:三酷猫,如若转载,请注明出处:https://www.sankumao.com/3557.html

(0)
上一篇 2022年10月9日 上午10:21
下一篇 2022年10月9日 下午5:10

相关推荐

  • Python复制文件的5种方法

    以下是“如何在Python中复制文件”的4种库的使用。+open方法来复制文件 一、shutil标准库 具体使用方法,请查看如下shutil库介绍教程。 二、os库 1.os.po…

    2022年11月16日
  • 如何将Python写的代码打包成.exe可执行文件

    pyinstaller打包机制   我们写的python脚本是不能脱离python解释器单独运行的,所以在打包的时候,至少会将python解释器和脚本一起打包,同样,为了打包的ex…

    2022年10月14日
  • python导包时,使用.来导包

    今天在学习scrapy,看别人代码时,发现这种写法..导包的方式 。 场景一、使用..来导上一级目录下的包: 场景二、使用.来导同一级目录下的包: 像我之前就是使用from fan…

    2022年11月13日
  • Python爬虫教程七:Scrapy框架(上)

    一、Scrapy框架简介 Scrapy是用Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 框架的优势在于,用户只需要定制开发几个模块就可以轻松…

    2022年10月14日
  • Python爬虫教程一:urllib库数据挖掘

    一、什么是Urllib Urllib是python内置的HTTP请求库,包括以下模块 二、request模块 1.urlopen方法 用于直接打开网址。 response.stat…

    2022年10月12日
  • 10个有趣的 Python 高级脚本,建议收藏!

    在日常的工作中,我们总会面临到各式各样的问题。 其中不少的问题,使用一些简单的Python代码就能解决。 比如不久前的复旦大佬,用130行Python代码硬核搞定核酸统计,大大提升…

    2022年4月23日
  • 基于scrapy的redis安装和配置方法

    在定向爬虫的制作过程中,使用分布式爬取技术可以显著提高爬取效率。而 Redis 配合 Scrapy 是实现分布式爬取的基础。 Redis 是一个高性能的 Key-Value 数据库…

    2022年11月13日
  • Python轻量级Web框架:Bottle库!

    Bottle是一个超轻量级的python库。说是库,其本身只由一个4000行左右的文件构成,并且不需要任何依赖,只靠python标准库即可运作。和它本身的轻便一样,Bottle库的…

    2022年11月10日
  • for else语法、try ….except….else语法 和 while….else语法

    这三种语句都是差不多的。都是前面的内容是正常执行完成的就会执行else语句,如果是非正常,比如:执行失败,或者break跳出,那么都是不会执行else语句的! 1.for … el…

    2022年9月13日
  • python 类属性、类方法、及静态方法等

    类方法、类属性 类方法需要用 装饰器 @classmethod 来标识• 类方法的 第一个参数 应该是 cls• 由 哪一个类 调用的方法,方法内的 cls 就是 哪一个类的引 用…

    2022年7月13日