AI因你而升温,记得加个星标哦!
在工作中,我们常常面临着代码提速优化问题,本文就为大家介绍几种Python
常用的提速技巧。
优化原则:
1.先保证代码可以正确运行,再进行性能优化
2.优化的选择通常是牺牲空间换取时间,所有我们需要权衡代价
3.着重优化代码耗时的部分,通篇优化通常会降低代码的可读性
0 定义耗时装饰器
# 可监控程序运行时间
import time
def clock(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("共耗时: %s秒" % round(end_time - start_time, 2))
return result
return wrapper复制
1 避免使用全局变量
start_time = time.time()
size = 10000
for x in range(size):
for y in range(size):
z = x * y
end_time = time.time()
print('共耗时:%s秒' % round(end_time - start_time, 2))
# 共耗时:11.78秒,不推荐复制
# 使用局部变量
@clock
def multiplication():
size = 10000
for x in range(size):
for y in range(size):
z = x * y
multiplication()
# 共耗时: 5.5秒,提速50%复制
2 避免访问方法(函数)的属性,尽量使用from X import X
import math
@clock
def computeSqrt():
result = []
for i in range(10000000):
# math方法访问sqrt属性
result.append(math.sqrt(i))
computeSqrt()
# 不推荐,共耗时: 2.09秒复制
# 使用from X import X,直接访问sqrt
from math import sqrt
@clock
def computeSqrt():
result = []
for i in range(10000000):
result.append(sqrt(i))
computeSqrt()
# 推荐,共耗时: 1.75秒复制
在【1】中我们讲到,局部变量的查找会比全局变量更快,因此对于频繁访问的变量append
,通过将其改为局部变量可以加速运行。
from math import sqrt
@clock
def computeSqrt():
result = []
# 赋值给局部变量
append = result.append
for i in range(10000000):
append(sqrt(i))
computeSqrt()
# 推荐,共耗时: 1.45秒复制
3 遍历优化
# 使用while进行遍历
@clock
def circulate():
i = 0
li = []
append = li.append
while i < 10000000:
append(i*2)
i += 1
return li
circulate()
# 不推荐,共耗时:1.48秒复制
@clock
def circulate():
li = []
append = li.append
# 使用for代替while
for i in range(10000000):
append(i*2)
return li
circulate()
# for优于while,共耗时:1.09秒复制
@clock
def circulate():
# 使用列表推导式
return [i*2 for i in range(10000000)]
circulate()
# 推荐列表推导式,共耗时:0.88秒。但不适用于复杂计算。复制
4 减少内层for循环的计算
from math import sqrt
@clock
def inner():
size = 10000
for x in range(size):
for y in range(size):
# 相当于在重复计算sqrt(x)
z = sqrt(x) + sqrt(y)
inner()
# 不推荐,共耗时:19.00秒复制
from math import sqrt
@clock
def inner():
size = 10000
for x in range(size):
# 只计算一次sqrt(x),然后将它存了起来
sqrt_x = sqrt(x)
for y in range(size):
z = sqrt_x + sqrt(y)
inner()
# 推荐,共耗时:10.22秒复制
5 使用Numpy
数据类型进行运算
因为Numpy
底层是用C语言
实现的,而Python
这种脚本语言相比C/C++
这种编译语言在效率和性能方面有天然劣势,所以我们可以引入Numpy
包,对数据进行类型转换后再进行计算。
import numpy as np
li = [i for i in range(10000000)]
@clock
def npSpeed():
# 使用Python方法
sum(li)
npSpeed()
# 共耗时0.79秒复制
import numpy as np
li = np.array([i for i in range(100000000)])
@clock
def npSpeed():
# 使用Numpy方法
np.sum(li)
npSpeed()
# 共耗时0.11秒,速度约是Python的8倍复制
Numpy
的优势在数据量越大时,体现的也会更加明显。所以在机器学习与深度学习项目任务中,Numpy
的使用就非常频繁。
文章转载自AI有温度,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
python排序sort()和sorted()区别
wzf0072
57次阅读
2025-04-09 19:57:46
AI与我共创WEB界面
布衣
50次阅读
2025-04-14 22:13:51
解决pyqt5 textbrowser控件超链接锚点问题
zayki
32次阅读
2025-04-27 16:58:59
python 实现消费者优先级队列
天翼云开发者社区
25次阅读
2025-04-25 11:08:21
优雅遍历和删除特定开头的key
陌殇流苏
24次阅读
2025-04-25 12:17:03
《深入剖析Python的生成器表达式与列表推导式:探寻代码背后的哲学与艺术》
程序员阿伟
21次阅读
2025-04-27 16:22:14
python中标识符的命名规则和命名规范
周同学带您玩AI
18次阅读
2025-04-21 10:34:44
python自动更新dns A记录
godba
11次阅读
2025-04-23 11:19:04
Python运维神器:这些模块让你事半功倍
韩公子的Linux大集市
11次阅读
2025-04-09 11:13:18
python中不同数据类型转换-布尔型
周同学带您玩AI
8次阅读
2025-04-22 10:12:05