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

云环境下Polars加载速度慢于Pandas,求问题排查

问题分析与优化方案

核心问题原因

  1. 远程存储读取实现差异:Polars直接通过storage_options读取Azure Blob的实现,目前适配成熟度不如Pandas,导致网络IO效率偏低。
  2. Azure函数资源限制:消费计划下的函数CPU、内存资源有限,Polars的并行计算优势难以充分发挥,而Pandas单线程模式受资源限制影响更小。
  3. 代码细节问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:33:20