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 进行请求

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...