Python中如何无需for循环为百万级JSON记录追加key字段
百万级JSON数组高效添加序号Key的实现方案
需求是将如下结构的JSON:
{ "records": [ { "value": {"col1":"val11","col2":"val12"} }, { "value": {"col1":"val21","col2":"val22"} } ] }
转换为每个数组元素包含key-N序号字段的结构:
{ "records": [ { "key": "key-1", "value": {"col1":"val11","col2":"val12"} }, { "key": "key-2", "value": {"col1":"val21","col2":"val22"} } ] }
由于数据量可达百万级,需避免低效的显式for循环,以下是几种高性能实现方案:
方案一:列表推导式(Python原生高效实现)
列表推导式由底层C代码实现,比普通for循环+append的方式性能提升数倍,代码简洁:
# 假设原始数据已加载为Python字典data data['records'] = [{"key": f"key-{i+1}", **item} for i, item in enumerate(data['records'])]
方案二:map函数结合enumerate
map函数同样基于底层优化,通过匿名函数批量处理元素,避免显式循环语法:
data['records'] = list(map(lambda x: {"key": f"key-{x[0]+1}", **x[1]}, enumerate(data['records'])))
方案三:Pandas矢量化处理(超大数据量最优解)
针对千万级以上数据,Pandas的矢量化操作将循环转移到C语言层面,性能优势显著:
import pandas as pd # 将records数据转换为DataFrame df = pd.DataFrame([item['value'] for item in data['records']]) # 生成key列 df['key'] = df.index.map(lambda idx: f"key-{idx+1}") # 转换回目标JSON结构 data['records'] = df.apply( lambda row: {"key": row['key'], "value": row.drop('key').to_dict()}, axis=1 ).tolist()
性能说明
Python的显式for循环因解释执行的特性,每次迭代存在Python层面的开销;而上述方案均将循环逻辑放在底层优化的代码中执行,能大幅降低处理百万级数据的耗时。
内容的提问来源于stack exchange,提问作者gdol
相关产品推荐
相关产品推荐

