讲师中心 微信公众号
AI工具推荐 视频效率加速

如何高效处理深度嵌套的数据结构:迭代式扁平化与性能优化指南

陌芳大大_6067

陌芳大大_6067

发布时间:2026-09-02 17:18:00

|

406人浏览过

|

来源于php中文网

原创

如何高效处理深度嵌套的数据结构:迭代式扁平化与性能优化指南

本文介绍一种不依赖递归的迭代算法,用于安全、高效地扁平化任意深度的嵌套字典/列表结构,彻底规避 python 默认递归限制与栈溢出风险,并支持超深嵌套(数百层)场景。

本文介绍一种不依赖递归的迭代算法,用于安全、高效地扁平化任意深度的嵌套字典/列表结构,彻底规避 python 默认递归限制与栈溢出风险,并支持超深嵌套(数百层)场景。

在实际数据处理中(如解析 API 响应、配置文件或 JSON Schema),我们常遇到动态、不可预知深度的嵌套结构——它可能包含多层嵌套的 dict 和 list,甚至混合出现。虽然递归实现直观简洁,但 Python 默认递归深度限制(通常为 1000)极易被突破;而盲目调高 sys.setrecursionlimit() 不仅治标不治本,还可能导致解释器崩溃或内存耗尽。更关键的是,真正的瓶颈往往不是“深度”,而是隐含的循环引用或指数级分支爆炸(例如每层含 2 个子项、100 层即产生 $2^{100}$ 个路径),此时任何算法都无法在有限资源内完成。

因此,高性能、生产就绪的扁平化方案必须满足三点:
✅ 无递归调用 —— 完全规避栈溢出;
✅ 惰性生成(generator) —— 避免一次性构建巨大列表,节省内存;
✅ 循环引用防御 —— 显式检测并跳过已访问对象,防止无限遍历。

以下是一个健壮、通用、可直接复用的迭代式扁平化实现:

def flatten(data):
    """
    迭代式扁平化嵌套结构(dict/list),返回值生成器。
    自动跳过循环引用,适用于任意深度(包括数百层)。
    """
    from collections.abc import Mapping, Sequence

    seen = set()  # 用于检测循环引用(基于 id)
    stack = [iter([data])]

    while stack:
        try:
            item = next(stack[-1])
            item_id = id(item)

            # 检测循环引用:若对象已被访问过,跳过
            if isinstance(item, (Mapping, Sequence)) and not isinstance(item, (str, bytes)):
                if item_id in seen:
                    continue
                seen.add(item_id)

            # 若为 dict 或 list,压入其元素迭代器
            if isinstance(item, Mapping):
                stack.append(iter(item.values()))
            elif isinstance(item, Sequence) and not isinstance(item, (str, bytes)):
                stack.append(iter(item))
            else:
                yield item  # 叶子节点:基本类型(str, int, float, bool, None 等)

        except StopIteration:
            stack.pop()
            # 清理已出栈对象的引用记录(可选,提升内存友好性)
            if stack:
                # 注意:此处不主动清理 seen,因 id 复用概率低且清理逻辑复杂;
                # 实际高负载场景可考虑 weakref.WeakSet 替代
                pass

✅ 使用示例

data = {
    "name": "John",
    "contacts": [
        {"type": "email", "value": "[email protected]"},
        {"type": "phone", "value": [{"country": "US", "number": "123-456-7890"}]}
    ],
    "address": {"city": "New York", "coordinates": [{"lat": 40.7128, "lon": -74.0060}]}
}

# 获取扁平化结果(惰性生成,内存友好)
flattened = list(flatten(data))
print(flattened)
# 输出: ['John', 'email', '[email protected]', 'phone', 'US', '123-456-7890', 'New York', 40.7128, -74.0060]

⚠️ 关键注意事项

  • 字符串与字节串不展开:isinstance(item, (str, bytes)) 被显式排除在容器判断之外,避免将 "hello" 错误拆解为 ['h','e','l','l','o'];
  • 循环引用防护:通过 id() 快速标记已遍历对象,对含自引用的结构(如 a = {}; a['self'] = a)安全鲁棒;
  • 内存效率优先:返回 generator,如需列表则显式调用 list(flatten(data));处理 TB 级数据时,可配合 for value in flatten(data): process(value) 流式处理;
  • 类型兼容性:使用 collections.abc.Mapping / Sequence 而非硬编码 dict/list,天然支持 OrderedDict、defaultdict、tuple、deque 等标准容器。

? 是否需要第三方库?

对于绝大多数场景,上述纯 Python 实现已足够高效稳定。若项目已引入 toolz 或 more-itertools,可参考其 deepmap 或 collapse 工具,但它们同样基于迭代栈,且默认不内置循环引用检查。真正需要外部库的场景,通常是需结合 schema 验证、类型转换或异步 I/O —— 此时建议封装为独立模块,而非依赖通用扁平化工具。

总结:面对深度嵌套,放弃递归是第一步;采用显式栈 + 生成器 + 循环检测,才是兼顾安全性、性能与可维护性的工程实践。

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1571

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

3764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1589

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

21537

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2647

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2707

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1083

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.08.10

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn