如何在Jupyter Notebook中加速Python处理大数据表的嵌套循环
如何加速大数据表的嵌套循环处理(基于Pandas)?
你的嵌套循环代码在处理大数据表时效率极低,核心原因是逐元素的循环操作时间复杂度为O(n*m),数据量上去后会严重拖慢速度。下面是几种实用的优化方案:
优先用Pandas的merge操作替换嵌套循环
这是最推荐的方案,Pandas的merge是底层优化的向量化操作,比手动循环快几个数量级,而且逻辑清晰:# 提取需要的映射列并改名,和目标表的关联字段对齐 mapping_df = df_TBL_SentMail[['ID', 'MailNbr']].rename(columns={'ID': 'MailId', 'MailNbr': 'UnifiedMailNumber'}) # 左连接保留原表所有行,匹配填充UnifiedMailNumber df_MailBox_SentService = df_MailBox_SentService.merge(mapping_df, on='MailId', how='left')这个逻辑和你原代码完全一致:找到MailId匹配的行,填充对应的MailNbr值。
用字典映射+map方法快速匹配
如果只是简单的键值映射,用字典+map的组合效率也很高:# 把ID和MailNbr转成键值对字典 mail_mapping = df_TBL_SentMail.set_index('ID')['MailNbr'].to_dict() # 直接用map批量映射值 df_MailBox_SentService['UnifiedMailNumber'] = df_MailBox_SentService['MailId'].map(mail_mapping)字典的查找是O(1)复杂度,整个操作是O(n),比嵌套循环快很多。
如果必须保留循环逻辑,先优化查找方式
要是你因为某些原因必须用循环,先把内层循环的查找换成字典,再用更高效的行遍历方法:mail_mapping = df_TBL_SentMail.set_index('ID')['MailNbr'].to_dict() # 用itertuples遍历行,比直接遍历index+at取值快 for row in df_MailBox_SentService.itertuples(): if row.MailId in mail_mapping: df_MailBox_SentService.at[row.Index, 'UnifiedMailNumber'] = mail_mapping[row.MailId]这种方式去掉了内层的嵌套循环,效率比原代码提升明显,但还是不如前两种向量化方法。
在Jupyter Notebook里,你可以用%timeit魔法命令对比不同方法的运行速度,比如:
%timeit df_MailBox_SentService.merge(mapping_df, on='MailId', how='left')
内容的提问来源于stack exchange,提问作者Aymen Ragguem
相关产品推荐
相关产品推荐

