商城首页欢迎来到中国正版软件门户

您的位置:首页 >高效查找对象数组中的单个对象方法

高效查找对象数组中的单个对象方法

  发布于2026-04-17 阅读(0)

扫一扫,手机访问

如何高效地通过对象属性从对象数组中查找单个对象?

本文介绍如何将线性搜索的患者对象查找优化为哈希表(字典)查找,大幅提升处理大规模日志文件时的性能,核心是用 dict 替代 list 存储患者实例,并以 pat_id 为键实现 O(1) 平均时间复杂度的快速定位。

本文介绍如何将线性搜索的患者对象查找优化为哈希表(字典)查找,大幅提升处理大规模日志文件时的性能,核心是用 `dict` 替代 `list` 存储患者实例,并以 `pat_id` 为键实现 O(1) 平均时间复杂度的快速定位。

在处理海量医疗日志时,原始代码中使用 for pat in patient.all_patients 遍历整个患者列表进行 ID 匹配,属于典型的 O(n) 线性搜索。当患者数量达数千、日志行数超百万时,重复执行该逻辑会导致严重性能瓶颈——例如每行日志都遍历全部患者,总时间复杂度高达 O(n × m),极易成为性能瓶颈。

更优解是利用 Python 字典(dict)底层的哈希表结构,将查找复杂度降至 平均 O(1)。关键改造如下:

  • 移除全局类变量 all_patients:避免隐式状态和线程不安全风险;
  • 改用 patients: dict[int, Patient] 存储:以 pat_id 为键,Patient 实例为值;
  • 消除冗余循环与 any() 检查:直接通过 in 或 setdefault() 完成存在性判断与初始化。

以下是优化后的完整实现:

class Patient:
    def __init__(self, pat_id: int):
        self.pat_id = pat_id
        self.plans = []  # 使用普通 list,若需去重可考虑 set(注意保持插入顺序时慎用)

# 初始化空字典,替代原 all_patients 列表
patients = {}
total_plans = 0

# 假设 index 是当前日志行解析后的列表(如 index = line.strip().split('\t'))
patient_id = int(index[4])   # 确保类型一致,避免字符串/整数混用
plan_name = index[11]

# 方式1:显式判断 + 字典赋值(清晰易读)
if patient_id not in patients:
    patients[patient_id] = Patient(patient_id)

# 添加计划(自动去重)
if plan_name not in patients[patient_id].plans:
    patients[patient_id].plans.append(plan_name)
    total_plans += 1

print(f"Total unique patients: {len(patients)}")
print(f"Total unique plans added: {total_plans}")

? 进阶建议:若 plans 仅需唯一性且不依赖插入顺序,可将 self.plans 改为 set(),使 in 判断也保持 O(1);若需保留添加顺序并去重,可用 collections.OrderedDict 或 Python 3.7+ 的 dict.fromkeys(plans) 去重后重建列表。

⚠️ 注意事项

  • 确保 index[4] 和 index[11] 下标有效,建议添加 try/except IndexError 或预校验;
  • 若 pat_id 来自文本日志,务必转换为统一类型(如 int(index[4])),避免 "123" 与 123 被视为不同键;
  • 多线程环境下需加锁或改用线程安全结构(如 threading.Lock 包裹字典操作);
  • 内存方面:字典比列表略占空间,但对千万级患者仍远优于线性扫描的时间代价。

通过这一重构,日志处理速度可提升数十至数百倍,真正实现可扩展的大数据医疗日志解析。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注