python 循环优化

python循环是非常耗时的,所以遇到比较大的数组就要对循环做优化,代码:

python 复制代码
                for i in range(pred_density_up.shape[0]):
                    for j in range(pred_density_up.shape[1]):
                        if pred_density_up[i][j] >= 0.1:
                            points.append([j , i ])

上面的循环是最长见的,但是计算速度比较慢。

那么如何优化呢?

要优化这段代码以提高执行速度,主要思路是减少循环的次数和避免在循环内部进行不必要的操作。在你的代码中,你正在遍历一个二维数组(可能是图像或矩阵的密度预测),并统计那些值大于或等于0.1的元素,同时记录这些元素的坐标。以下是一些优化方法:

方法 1: 使用 NumPy 的向量化操作

NumPy 的向量化操作可以大幅度提高性能,因为它是在 C 层面优化的,并且减少了 Python 循环的开销。

python 复制代码
import numpy as np

# 假设 pred_density_up 是一个 NumPy 数组
mask = pred_density_up >= 0.1
count = np.sum(mask)  # 计算满足条件的元素数量
points = np.argwhere(mask).tolist()  # 获取满足条件的元素的坐标

# 如果需要,可以调整坐标的顺序(假设原始数组是行优先的,但你想要列优先)
points = [[y, x] for x, y in points]

方法 2: 使用列表推导式(对于较小的数据集)

如果数据集不是特别大,列表推导式也可以提供较好的性能,并且代码更简洁。

python 复制代码
points = [[j, i] for i in range(pred_density_up.shape[0]) for j in range(pred_density_up.shape[1]) if pred_density_up[i][j] >= 0.1]
count = len(points)

方法 3: 使用 itertools.product 和 filter

对于想要更函数式编程风格的人来说,可以使用 itertools.product 来生成坐标,然后使用 filter 来筛选满足条件的坐标。

python 复制代码
from itertools import product

# 生成所有坐标
indices = product(range(pred_density_up.shape[0]), range(pred_density_up.shape[1]))
# 筛选满足条件的坐标
points = [[j, i] for i, j in indices if pred_density_up[i][j] >= 0.1]
count = len(points)

性能对比

在大多数情况下,方法 1(使用 NumPy 的向量化操作)将提供最佳的性能,因为它直接利用了 NumPy 的底层优化。对于大型数据集,这种差异尤其明显。

方法 2方法 3 在代码的可读性和简洁性方面有其优势,但在处理大型数据集时可能会较慢。

结论

推荐使用 方法 1 ,因为它既高效又易于理解和维护。如果你的数据集非常小,或者你对性能要求不是非常严格,那么 方法 2方法 3 也是可行的选择。

相关推荐
阿正的梦工坊15 分钟前
深入理解 PyTorch 中的 unsqueeze 操作
人工智能·pytorch·python
FreakStudio1 小时前
硬件版【Cursor】?aily blockly IDE尝鲜封神,实战硬伤尽显
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
郝学胜-神的一滴3 小时前
Qt 入门 01-01:从零基础到商业级客户端实战
开发语言·c++·qt·程序人生·软件构建
测试员周周3 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
摇滚侠3 小时前
@Autowired 和 @Resource 的区别
java·开发语言
2301_783848653 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南
jvm·数据库·python
Wy_编程3 小时前
go语言中的结构体
开发语言·后端·golang
SeaTunnel3 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
CLX05054 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署
jvm·数据库·python
大卡片4 小时前
C++的基础知识点
开发语言·c++