提升Python的执行效率的技巧有哪些
开始之前小伙伴先可以开发一个统计函数运行时间的python装饰器用于后面我们对各个python技巧使用后的时间统计。
# 导入时间提取的time模块 from time import time import dis def compute_time(func_): ''' 计算函数的运行时间 ''' def func_time(*arg, **kw): t1 = time() result = func_(*arg, **kw) t2 = time() print(f"{func_.__name__: >10} : {t2 - t1:.6f} 秒") return result return func_time
上述的compute_time时间计算函数我们开发好了,可以开发一个hello_world函数测试一下使用是否正常。
@compute_time def hello_world(): print("hello_world!") hello_world() # hello_world! # hello_world : 0.000000 秒
通过hello_world函数的测试,证明我们的时间装饰器compute_time能够正常统计出函数所运行的时间。
接下来,我们开始正式的介绍下面的五种方式来提高python的运行速度并提供时间运行的结果。
1、合理使用标准或非标准库
在开发过程中绝对不能小看python的标准或非标准库,说实话我们自己有时候写的同样的业务代码块确实是没有大佬们完美。
比如下面这个业务我们需要将一个python列表中的值转换成字符串,首先看看下面的代码块的写法。
# 初始化一个list列表 list_ = ['a', 'b', 'c'] * 10000 @compute_time def func_1(list_=None): ''' 列表元素转字符串函数 ''' str_ = '' for s in list_: str_ = str_ + s return str_ func_1(list_) # func_1 : 0.001999 秒
通过上面的func_1函数的执行情况使用自己写的传统的方式来转换步骤比较繁杂,并且花费了0.001999 秒的时间。
@compute_time def func_2(list_=None): ''' 列表元素转字符串 ''' return ''.join(list_) func_2(list_) # func_2 : 0.000000 秒
相比func_1函数的运行时间,func_2运行的时间几乎可以忽略不计,六位数的小数根本看不出来变化。
2、减少循环的使用
从平常开发的过程中其实已经发现,使用列表推导式、迭代式等的可序列化数据处理方式要比for循环更加的便捷、高效。
下面我们同样可以通过一个例子来说明问题,比如我们需要挑选出一个list列表中可以被2整除的数。
# 初始化循环次数n n = 100000 @compute_time def func_3(n=None): list_ = [] for m in range(n): if m % 2 == 0: list_.append(m) return list_ @compute_time def func_4(n=None): return [m for m in range(n) if m % 2 == 0] func_3(n) func_4(n) # func_3 : 0.004986 秒 # func_4 : 0.003014 秒
通过func_3函数、func_4函数的比较,首先func_4的方式比func_3精简了许多。
并且时间上func_4使用列表推导式的方式比普通的for循环运行速度上快了1/4的时间。
3、注意重复代码运行
关于代码的重复运行这个在我们通常的开发方式中都能体会到,也就是本可以作为公共代码块运行一次就可以。
可以却将能够公共使用的代码块加入到了循环当中,这样只会影响代码块的执行效率。
比如我们需要使用python的re模块去搜索字符串中的某一些元素,下面通过两种方式来比较时间结果。
# 导入正则表达式匹配模块 import re @compute_time def func_5(str_=None): for s in str_: result = re.search(r'a*[a-z]?c', s) @compute_time def func_6(str_=None): repx = re.compile(r'a*[a-z]?c') for s in str_: result = repx.search(s) func_5('abcdefg1234oks' * 1000) func_6('abcdefg1234oks' * 1000) # func_5 : 0.006999 秒 # func_6 : 0.002000 秒
对比func_5和func_6的业务实现方式,我们将re模块的compile正则匹配对象直接放到for循环的外层,运行时间直接就减少了3倍不止。
是因为在循环中直接使用search匹配正则对象,会在循环中不断地创建正则匹配对象,这样就
增加了for循环的处理负担,导致速度变慢。
4、减少全局变量使用
在说明这一点的时候,我们要明白全局变量在程序运行的过程中是一直存在的不会消失。
全局变量太多就会导致运行期间占用的内存太大,相比全局变量使用局部变量就会变得更加的高效。
下面我们通过两种方式的使用实例,来对比全局变量和局部变量的运行时间。
mes_1 = 'ss1' mes_2 = 'ss2' mes_3 = 'ss3' @compute_time def func_7(): result = mes_1 + mes_2 + mes_3 return result @compute_time def func_8(): me_1 = 'ss1' me_2 = 'ss2' me_3 = 'ss3' result = me_1 + me_2 + me_3 return result func_7() func_8() # func_7 : 0.000997 秒 # func_8 : 0.000000 秒
上面我们做了一个普通的加法计算已经说明了问题,func_8函数使用局部变量的方式确实速度更快。
5、使用合理的数据结构
在大多数的python开发过程中,想必很多人都是为了方便更多的时候使用的是list列表的方式来处理数据。
Python 有四种内置的数据结构:列表、元组、集合、字典,在合适的业务场景中使用合适的数据结构来处理数据同样能提高计算的执行效率。
比如:下面我们将从一个list列表和tuple元组来提取对应索引位置上面的值。
@compute_time def func_9(): data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] print(data[3]) @compute_time def func_10(): data = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') print(data[3]) func_9() func_10() # func_9 : 0.000000 秒 # func_10 : 0.000000 秒
通过执行func_9和func_10函数,我们发现时间上两者的差距不大,起码在六位小数之内是分辨不出结果的。
print('func_9汇编产生的机器码:') dis.dis(func_9) print('func_10汇编产生的机器码:') dis.dis(func_10)
最后,我们分别查看了func_9和func_10的汇编机器码,发现明显list列表处理产生的机器码更多。
# func_9汇编产生的机器码: # 30 0 LOAD_GLOBAL 0 (time) # 2 CALL_FUNCTION 0 # 4 STORE_FAST 2 (t1) # # 31 6 LOAD_DEREF 0 (func_) # 8 LOAD_FAST 0 (arg) # 10 LOAD_FAST 1 (kw) # 12 CALL_FUNCTION_EX 1 # 14 STORE_FAST 3 (result) # # 32 16 LOAD_GLOBAL 0 (time) # 18 CALL_FUNCTION 0 # 20 STORE_FAST 4 (t2) # # 33 22 LOAD_GLOBAL 1 (print) # 24 LOAD_DEREF 0 (func_) # 26 LOAD_ATTR 2 (__name__) # 28 LOAD_CONST 1 (' >10') # 30 FORMAT_VALUE 4 (with format) # 32 LOAD_CONST 2 (' : ') # 34 LOAD_FAST 4 (t2) # 36 LOAD_FAST 2 (t1) # 38 BINARY_SUBTRACT # 40 LOAD_CONST 3 ('.6f') # 42 FORMAT_VALUE 4 (with format) # 44 LOAD_CONST 4 (' 秒') # 46 BUILD_STRING 4 # 48 CALL_FUNCTION 1 # 50 POP_TOP # # 34 52 LOAD_FAST 3 (result) # 54 RETURN_VALUE # func_10汇编产生的机器码: # 30 0 LOAD_GLOBAL 0 (time) # 2 CALL_FUNCTION 0 # 4 STORE_FAST 2 (t1) # # 31 6 LOAD_DEREF 0 (func_) # 8 LOAD_FAST 0 (arg) # 10 LOAD_FAST 1 (kw) # 12 CALL_FUNCTION_EX 1 # 14 STORE_FAST 3 (result)
以上是提升Python的执行效率的技巧有哪些的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

直接通过 Navicat 查看 MongoDB 密码是不可能的,因为它以哈希值形式存储。取回丢失密码的方法:1. 重置密码;2. 检查配置文件(可能包含哈希值);3. 检查代码(可能硬编码密码)。

作为数据专业人员,您需要处理来自各种来源的大量数据。这可能会给数据管理和分析带来挑战。幸运的是,两项 AWS 服务可以提供帮助:AWS Glue 和 Amazon Athena。

启动 Redis 服务器的步骤包括:根据操作系统安装 Redis。通过 redis-server(Linux/macOS)或 redis-server.exe(Windows)启动 Redis 服务。使用 redis-cli ping(Linux/macOS)或 redis-cli.exe ping(Windows)命令检查服务状态。使用 Redis 客户端,如 redis-cli、Python 或 Node.js,访问服务器。

要从 Redis 读取队列,需要获取队列名称、使用 LPOP 命令读取元素,并处理空队列。具体步骤如下:获取队列名称:以 "queue:" 前缀命名,如 "queue:my-queue"。使用 LPOP 命令:从队列头部弹出元素并返回其值,如 LPOP queue:my-queue。处理空队列:如果队列为空,LPOP 返回 nil,可先检查队列是否存在再读取元素。

问题:如何查看 Redis 服务器版本?使用命令行工具 redis-cli --version 查看已连接服务器的版本。使用 INFO server 命令查看服务器内部版本,需解析返回信息。在集群环境下,检查每个节点的版本一致性,可使用脚本自动化检查。使用脚本自动化查看版本,例如用 Python 脚本连接并打印版本信息。

Navicat的密码安全性依赖于对称加密、密码强度和安全措施的结合。具体措施包括:采用SSL连接(前提是数据库服务器支持并正确配置证书)、定期更新Navicat、使用更安全的方式(如SSH隧道)、限制访问权限,最重要的是,绝不记录密码。
