You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求重构Synapse Notebook的PySpark JSON处理代码以提升性能

Pandas代码性能优化建议(Synapse Notebook JSON数据处理场景)

原代码的性能瓶颈

  • 用apply(axis=1)逐行遍历处理:这是Python层面的循环,数据量一大就会变得极慢
  • 对每个参数循环执行replace:每个字段要遍历所有参数,重复操作太多
  • 冗余判断row['xyz'] == row['xyz']:本质是判断xyz列非空,写法不够高效

优化方案

1. 用矢量化批量替换替代逐行循环

直接用Pandas内置的replace方法,一次性完成所有参数的替换,底层是C实现的矢量化操作,速度比逐行循环快几十倍甚至上百倍:

import pandas as pd

df_main = pd.DataFrame(table_data)
df_parameters = pd.DataFrame(parameter_data)

# 提前构建带|的参数映射,直接用于替换
parameter_map = {f'|{param}|': str(val) for param, val in zip(df_parameters['abc'], df_parameters['def'])}

# 筛选需要处理的行:xyz非空,且expression是字符串类型
mask = df_main['xyz'].notna() & df_main['expression'].apply(lambda x: isinstance(x, str))

# 批量替换expression列的所有参数
df_main.loc[mask, 'expression'] = df_main.loc[mask, 'expression'].replace(parameter_map, regex=True)

# 批量替换sp列的所有参数
df_main.loc[mask, 'sp'] = df_main.loc[mask, 'sp'].replace(parameter_map, regex=True)

2. 进一步优化:提前过滤无效数据

如果sp列也存在非字符串或空值的情况,可以给sp列单独加过滤条件,只处理需要替换的行:

# 针对sp列的过滤:xyz非空,且sp是字符串类型
sp_mask = df_main['xyz'].notna() & df_main['sp'].apply(lambda x: isinstance(x, str))
df_main.loc[sp_mask, 'sp'] = df_main.loc[sp_mask, 'sp'].replace(parameter_map, regex=True)

3. 新手必看性能小贴士

  • 永远优先用Pandas的矢量化方法(比如df.loc、df.replace、df.str.*系列),避免逐行操作(apply(axis=1)、iterrows)
  • 字符串替换尽量用replace的regex=True模式批量处理,不要自己写循环
  • 如果数据量特别大(百万行以上),可以考虑在Synapse中切换到PySpark分布式处理,性能提升更明显

内容的提问来源于stack exchange,提问作者Jess P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:43:41