云环境下Polars加载速度慢于Pandas,求问题排查
问题分析与优化方案
核心问题原因
- 远程存储读取实现差异:Polars直接通过
storage_options读取Azure Blob的实现,目前适配成熟度不如Pandas,导致网络IO效率偏低。 - Azure函数资源限制:消费计划下的函数CPU、内存资源有限,Polars的并行计算优势难以充分发挥,而Pandas单线程模式受资源限制影响更小。
- 代码细节问题:
os.environ('FILE_NAME')应改为os.environ.get('FILE_NAME')避免环境变量缺失时抛异常;导入Polars用pd别名易与Pandas混淆,建议改为pl。
优化方案
方案1:先下载Blob到本地临时文件再读取
将远程Blob文件下载到Azure函数临时目录,再用Polars读取本地文件——这是Polars优化最充分的场景,能大幅提升读取速度。
修改后的完整代码:
import logging from azure.storage.blob import BlobServiceClient import azure.functions as func import polars as pl import datetime import os from tempfile import NamedTemporaryFile def main(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') name = req.params.get('name') if not name: try: req_body = req.get_json() except ValueError: pass else: name = req_body.get('name') # 从环境变量获取存储配置 account_name = os.environ.get('ACCOUNT_NAME') account_key = os.environ.get('ACCOUNT_KEY') container_name = os.environ.get('CONTAINER_NAME') blob_name = os.environ.get('FILE_NAME') # 初始化Blob客户端 blob_service_client = BlobServiceClient( account_url=f"https://{account_name}.blob.core.windows.net", credential=account_key ) container_client = blob_service_client.get_container_client(container_name) blob_client = container_client.get_blob_client(blob_name) load_stime = datetime.datetime.now() # 下载到临时文件 with NamedTemporaryFile(mode='wb', delete=False, suffix='.csv') as temp_file: blob_client.download_blob().readinto(temp_file) temp_file_path = temp_file.name # Polars读取本地文件 df = pl.read_csv(temp_file_path) # 清理临时文件 os.unlink(temp_file_path) load_etime = datetime.datetime.now() delta_time = (load_etime - load_stime).total_seconds() if name: return func.HttpResponse(f"Hello, {name}. 函数执行成功。数据列:{df.columns},数据形状:{df.shape},加载耗时:{delta_time} 秒") else: return func.HttpResponse( f"函数执行成功。数据形状:{df.shape},加载耗时:{delta_time} 秒。", status_code=200 )
方案2:使用Polars懒加载模式
如果不需要立即加载全量数据,可使用scan_csv懒加载,减少内存占用并提升速度:
# 替换读取部分代码 lf = pl.scan_csv(temp_file_path) # 若需获取数据形状,执行collect() df = lf.collect() shape = df.shape
方案3:调整Azure函数运行计划
将函数从消费计划切换到高级计划或专用计划,分配更多CPU和内存资源,Polars的并行计算优势会更明显,能恢复本地测试时的性能差距。
验证效果
采用方案1后,Polars的读取速度会接近本地测试水平,远超Pandas的读取耗时。
内容的提问来源于stack exchange,提问作者Joy Maitra
相关产品推荐
相关产品推荐

