Python性能优化实录
admin
2024-02-23 10:19:58
0次
【向量化计算】将数组逐个相加改为 numpy 数组相加
@simple_mark_time
def func1(aa):bb = [0] * aa.shape[1]for i in range(aa.shape[0]):row = aa[i]bb = [row[i] + bb[i] for i in range(len(row))]return bb@simple_mark_time
def func2(aa):bb = np.full((aa.shape[1],), 0, dtype=np.float64)for i in range(aa.shape[0]):row = aa[i]bb += rowreturn bbif __name__ == "__main__":a = np.random.random((531, 17280))b1 = func1(a)  # func1 use time = 2.3398b2 = func2(a)  # func2 use time = 0.008print(np.all(np.array(b1) == b2))  # True
【一次性申请内存】先初始化 Numpy 数组再往 Numpy 数组中填值,而不是先构造 Numpy 数组的列表再转为 Numpy 数组
@simple_mark_time
def func1(aa):bb = np.full((500, 17280), np.nan, dtype=np.float64)for i in range(aa.shape[0]):row = aa[i]bb[i] = rowreturn bb@simple_mark_time
def func2(aa):bb = []for i in range(500):if i < aa.shape[0]:row = aa[i]else:row = np.full((17280,), np.nan, dtype=np.float64)bb.append(row)bb = np.array(bb)return bbif __name__ == "__main__":a1 = np.random.random((50, 17280))b1 = func1(a1)  # func1 use time = 0.015b2 = func2(a1)  # func2 use time = 0.0489print(np.all(b1[~np.isnan(b1)] == b2[~np.isnan(b2)]))  # Truea2 = np.random.random((500, 17280))b1 = func1(a2)  # func1 use time = 0.03b2 = func2(a2)  # func2 use time = 0.0369print(np.all(b1[~np.isnan(b1)] == b2[~np.isnan(b2)]))  # True
【逻辑简化】之前的逻辑在第一个模块中构造了 numpy 矩阵,在第二个模块中根据要求调整了 numpy 中行的顺序,重新构造了矩阵。现在在第一个模块构造 numpy 矩阵前,就直接根据要求调整了行的顺序,从而不需要再调整顺序及重新构造矩阵。
【异步处理】在任务构造进程中,增加线程间共享的缓存队列,令线程 1 将读取任务并写入缓存队列,线程 2 直接将缓存队列的任务写入进程间共享的计算任务队列;从而必须要再等待全部任务读取完成后才将任务添加到计算任务队列。
【向量化计算】将统计 numpy 矩阵的求和操作从 Python 的原生 sum 函数改为 np.sum 函数
【向量化计算】使用 numpy 的函数实现数组首尾 0 的数量统计

验证实例:【Python性能优化实例】计算 numpy 数组首尾为 0 的数量

【时间复杂度】使用 set 的查找方法,而不是 list 的查找方法

验证实例:【Python性能优化】元素极少时list和set的查找速度


  • 【逻辑简化】如果需要遍历存在于集合 A 而不存在于集合 B 的,那么遍历差集(A - B)的性能将由于遍历并集(A | B)后,再判断是否只在集合 A 中存在
  • 【空间换时间】根据迭代器初始化集合需要消耗 O(N) 的性能,因此如果集合需要多次使用,则不妨先将集合存储下来
  • 【语法优化】如果需要遍历字典的键及对应的值,那么使用 .items() 将获得更好的性能
  • 【逻辑简化】如果需要判断一个值是否在字典的键中,直接判断即可,不需要将字典的键转为集合再判断
  • 【逻辑简化】如果已经确定键存在于字典中,则没有必要使用 get 方法
  • 【逻辑简化】如果我们频繁地获取某个路径较深的元素,不妨直将将其拿出来,以降低每次从路径中获取消耗的性能
  • 【减少 web 请求】在请求 ES 索引时,如果只需要档案中的部分字段,则需要添加 _source 进行请求

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...