【Django-功能优化】存储、循环、操作选择对代码性能的影响

news/2024/11/7 14:30:29/

功能开发背景

港口货轮需要进行集装箱的装卸任务:

image-20230625174847439

船上的每一个集装箱,可以用三个维度的坐标来唯一定位:(bay, column, layer),这三个维度结合其他一些固有信息,构成了一个箱子的字段属性,存储在箱子数据表中。

image-20230625201800934

现在需要以bay为单位,对bay内所有column、layer下的箱子,按照特有作业优先级进行作业顺序的编号(优先级从高到低:40尺-单钩箱子>20尺-双钩箱子>20尺-单钩箱子)。

即某个bay下,所有column最上层的箱子,统计他们的优先级,取其优先级最高的特定优先级进行作业,等到所有column最高层的箱子没有该优先级的箱子,按照低一级的优先级进行作业。如此循环往复三个优先级,直到所有的箱子都被编上作业顺序。

实现思路

大意如此,细节上的约束限制条件,不展开描述

  1. 获取船舶所有的bay信息
  2. 针对每一个bay信息,通过Django ORM查询数据库并返回满足条件的箱子集合
  3. 获取这些箱子集合包含的column、layer,并存储在列表中
  4. 两层循环遍历每一个箱子(按照层数和列数:从上到下(层),从左到右(列)遍历):

不用双层遍历的算法难度太大,构思不出来

for lay in layers:for col in columns:pass
  1. 在 优先级i 遍历的过程中,如果某列的箱子优先级不是i,则标记该列,在i优先级的后续遍历过程中不再考虑该列的箱子。

代码实现细节带来的速度差异

箱子数量计数

# 老版
for lay in layers:for col in lay_columns[lay]:boxes_selected = temp_queryset.filter(box_column=col, box_layer=lay)# ========================================len_boxes_selected = boxes_selected.count()# ========================================if len_boxes_selected == 2:if boxes_selected[0].is_work_together == 1:self.boxes_number_1(boxes_selected)else:self.boxes_number_2(boxes_selected)elif len_boxes_selected == 1:self.boxes_number_1(boxes_selected)else:pass# 新版
for lay in layers:for col in lay_columns[lay]:boxes_selected = temp_queryset.filter(box_column=col, box_layer=lay)# ========================================len_boxes_selected = len(boxes_selected)# ========================================if len_boxes_selected == 2:if boxes_selected[0].is_work_together == 1:self.boxes_number_1(boxes_selected)else:self.boxes_number_2(boxes_selected)elif len_boxes_selected == 1:self.boxes_number_1(boxes_selected)else:pass

对计数后的查询集进行修改操作,用len()函数要比count()函数,效率高一点

参考文章:https://blog.csdn.net/qq_39187019/article/details/108170726

箱子列和层数的获取方式

# 老版
layer = [86, 84, 82, 80, 78, 76]
column = [16, 14, 12, 10, 8, 6, 4, 2, 0, 1, 3, 5, 7, 9, 11, 13, 15]# 新版
layer = [86, 84, 82, 80, 78, 76]
column = {86:[16, 14, 12, 10, 8, 6, 4, 2, 0, 1, 3, 5, 7, 9, 11, 13, 15],84:[14, 12, 10, 8, 6, 4, 2, 0, 1, 3, 5, 7, 9, 11],82:[16, 14, 12, 10, 8, 6, 4, 2, 0, 1, 3, 5, 7, 9, 11, 13, 15],80:[10, 8, 6, 4, 2, 0, 1, 3, 5, 7, 9, 11, 13, 15],78:[16, 14, 12, 10, 8, 6, 4, 2, 0, 1, 3, 5, 7, 9, 11, 13, 15],76:[16, 14, 12, 10, 8, 6, 4, 2, 0, 1, 3, 5, 7]
}

老版:获取这个bay下所有箱子里面,涉及到的列和层

  1. 该方法十分方便的获取列和层
  2. 但是存在冗余,特定列,特定层下是没有箱子的,比如:(84, 16)

新版:获取这个bay下所有箱子里面,涉及到的层,再获取特定层下面涉及到的列信息

  1. 该方法相较于老版,在获取列信息上会更加耗时
  2. 但是不存在冗余,只要是遍历到的层、列,就一定能保证有箱子

整体计算下来,新版更加节省时间

结果存储方式的不同

# 老版本
self.numbered_boxes |= changed_queryset# 新版本
for box in changed_queryset:self.numbered_boxes.append(box)

老版:对已经编号的箱子集合进行并集操作

  1. 最终的存储结果:<class ‘django.db.models.query.QuerySet’>

新版:在对箱子编号的时候,对箱子进行append操作

  1. 最终的存储结果:[<class ‘icwp_basic_data.models.Ship_Box_Data’>, <class ‘icwp_basic_data.models.Ship_Box_Data’>, …]

运算结果对比

上述改动,都是逐一改变的,每次改变都会有时间上的节省。

下边仅展示最终结果

数据量:10307条数据

image-20230625195855614

运算时间

版本运算时长(s)
老版316
新版143

老版

image-20230625200430898

新版

image-20230625200939949


http://www.ppmy.cn/news/571926.html

相关文章

张量的操作和运算

张量计算是一种在数学和计算机科学中广泛应用的概念。张量可以被理解为多维数组或矩阵的推广&#xff0c;它在许多领域&#xff0c;如线性代数、物理学、计算机视觉、机器学习和深度学习中都有重要的应用。 在张量计算中&#xff0c;常常会涉及到一些基本的操作&#x…

【VSCode】设置关键字高亮的插件 | Highlight Word

目录 一、概述二、安装 highlight-words 插件三、配置 highlight-words 插件3.1 默认配置3.2 修改 settings.json 配置文件 四、设置高亮快捷键F8五、效果演示 一、概述 本文主要介绍在 VSCode 看代码时&#xff0c;怎样使某个单词高亮显示&#xff0c;主要通过以下三步实现&am…

基于瑞芯微camera学习原创文章汇总pdf分享给大家

前面一段时间基于瑞芯微3568平台编写了camera系列文章&#xff0c; 一共12篇&#xff0c;目前更新完毕。 《瑞芯微文章合集》 camera系列文章编写前后一共花费2个月时间&#xff0c; 期间查阅了很多资料&#xff0c;做了很多实验&#xff0c; 根据自己的理解&#xff0c; …

谐波加噪声模型-HNM

Stylianous提出了谐波加噪声模型(Harmonic Plus Noise Model,HNM)。将信号分成谐波成分和噪声成分&#xff0c;谐波成分代表信号中的低频部分&#xff0c;可以由基频、幅度、相位三个参数表示&#xff1b;噪声代表信号的高频部分&#xff0c;可由高斯白噪声通过高通滤波器来表示…

Object Detection in 20 Years A Survey-论文翻译(阅读笔记)

Object Detection in 20 Years A Survey论文翻译&#xff08;阅读笔记&#xff09; 原文地址&#xff1a;[1905.05055] Object Detection in 20 Years: A Survey (arxiv.org) //2022.1.3日上午 10:30开始阅读 论文时间跨度&#xff1a;20世纪90年代 - 2019年&#xff0c;共25…

【论文阅读】General Framework to Evaluate Unlinkability in Biometric Template Protection Systems

事实上&#xff0c;仍然没有一个通用的框架来客观地评估生物特征模板的不可链接性&#xff0c;因为现有的文章有一些共同的缺点&#xff0c;包括&#xff1a;对生物特征数据的一致性的不切实际的假设和针对特定系统的非通用方法的开发[5]-[7]&#xff0c;将可链接性视为二元决策…

【c语言12】字符串函数(strlen,strcmp,strcpy,strcat,strstr,strtok,strerror)

文章目录 一、字符串函数1.1strlen&#xff08;求字符串长度&#xff09;1.2strcmp&#xff08;比较字符串&#xff09;1.3strcpy&#xff08;拷贝字符串&#xff09;1.4strcat&#xff08;追加字符串&#xff09;1.5strstr&#xff08;判断子串&#xff09;1.6sttok&#xff0…

Docker的run流程

底层原理 Docker怎么工作&#xff1f; Docker为什么比VM虚拟机块&#xff1f; 1.Docker有比虚拟机更少的抽象层 2.docker利用的是宿主机的内核&#xff0c;vm需要是Guest OS 所以说&#xff0c;新建一个容器的时候&#xff0c;docker不需要像虚拟机一样加载一个系统内核&am…