大型Pandas DataFrame传参返回最佳实践及SharePoint读写性能对比
大型Pandas DataFrame的函数传递/返回效率与最佳实践
核心问题解答
在Python中,Pandas DataFrame作为函数参数传递或从函数返回时,采用引用传递机制——不会复制整个数据集,仅传递内存地址。因此这类操作的性能开销极低,完全属于代码模块化的最佳实践:既不会额外占用大量内存,还能提升代码的复用性与可维护性。
场景a:写入1.5GB DataFrame到SharePoint
现有方案差异分析
两种方案的核心性能瓶颈并非DataFrame的传递,而是每次循环都重复调用getSharePointContext进行SharePoint认证——这是耗时的网络IO操作,会大幅拖慢整体速度。而DataFrame在方案1中的传递是引用传递,几乎无额外性能开销。
从代码结构看:
- 方案1将写入逻辑封装为函数,代码复用性强、易于维护;
- 方案2将所有逻辑平铺在主循环中,冗余度高,不利于后续扩展或修改。
推荐方案
优先选择优化后的方案1:将SharePoint上下文提前初始化一次,传入函数复用,避免每次循环重复认证。优化后的代码示例:
def writeData(largeDataframe, ctx, relpath, filename): target_folder = ctx.web.get_folder_by_server_relative_url(f"Shared Documents/{relpath}") buffer = io.BytesIO() largeDataframe.to_csv(buffer, index=False, encoding='utf-8', lineterminator='\n') buffer.seek(0) file_content = buffer.read() target_folder.upload_file(filename, file_content).execute_query() if __name__ == '__main__': lisFiles = ["aa.csv","bb.csv"] # 仅初始化一次上下文 ctx = getSharePointContext(uname, pwd) for file in lisFiles: df = pd.read_csv(file) # 处理df writeData(df, ctx, relpath, filename)
场景b:从SharePoint读取1.5GB CSV到DataFrame
现有方案差异分析
两种方案的性能几乎无差异:函数调用与DataFrame返回的开销可以忽略,核心耗时都集中在SharePoint认证、文件读取和Pandas解析CSV的步骤上。
代码结构层面:
- 方案1的函数封装让读取逻辑可复用,比如后续读取多个SharePoint文件时无需重复编写相同代码;
- 方案2的平铺式代码仅适用于单次读取场景,扩展性差。
推荐方案
优先选择优化后的方案1:同样提前初始化一次SharePoint上下文,传入函数复用,减少重复认证的开销。优化后的代码示例:
def readData(url, ctx): web = ctx.web ctx.load(web) ctx.execute_query() response = File.open_binary(ctx, url) bytes_file_obj = io.BytesIO(response.content) return pd.read_csv(bytes_file_obj, dtype=str, encoding='utf-8') if __name__ == '__main__': # 仅初始化一次上下文 ctx = getSharePointContext(uname, pwd) df1 = readData(url1, ctx)
内容的提问来源于stack exchange,提问作者MVKXXX
相关产品推荐
相关产品推荐

