Polars还是pandas:5GB连接快约44倍,迁移仍别一刀切

|作者: QUASA 编辑团队|2 分钟阅读| 1
Polars还是pandas:5GB连接快约44倍,迁移仍别一刀切

如果现有pandas作业反复处理大表连接或分组,值得优先评估把这些计算段迁到Polars。在db-benchmark计时汇总中,5GB连接套件的各题首次运行计时合计,Polars 1.42.1为3.0秒,pandas 2.2.3为130.7秒,约相差44倍;同规模分组分别为22.3秒和152.0秒。两套版本并非同期测试,这些倍数只能描述该组公开结果。

是否迁移整个项目,答案通常取决于瓶颈的位置。若耗时主要来自连接、聚合,而且结果交付前只需少量格式转换,局部迁移有明确的试验价值;若数据量小、处理以文本为主,或下游函数持续要求pandas DataFrame,改写成本可能超过节省的运行时间。先划出可独立核对输入和输出的计算段,比按库名决定整条流程更稳妥。

不同规模下,连接和分组的差距有多大

规模不能脱离操作类型来看。db-benchmark公开记录覆盖0.5GB、5GB和50GB的分组及连接任务:0.5GB套件中,pandas与Polars的分组计时合计分别为12.0秒和1.6秒,连接为10.7秒和0.3秒;50GB分组中,pandas以1162秒完成10题中的9题,Polars以283秒完成全部10题;50GB连接列有Polars 1.30的59.0秒结果,却没有可直接配对的pandas结果。

这些合计值来自套件内多道题,不等于某次业务连接或一条流水线从读取到写出的耗时。尤其在最大规模下,分组的完成题数不同,连接又缺少配对结果,不能把两个数字直接相除后宣称普遍提速。基准页还限定了数据排列、缺失值和连接表大小等条件;生产数据中的键重复、列宽和可用内存不同,结果就可能变化。

小规模连接同样出现很高的相对倍数,但决策还要看绝对等待时间。把十几秒缩短到不足一秒,与把每天反复运行的关键作业缩短数分钟,对项目的价值并不相同。若外部取数、写盘或网络传输占了大部分时间,单独加速表内计算也未必显著缩短整条作业。

Polars的优势通常从哪里产生

大表变换适合Polars,原因不只是某个连接函数更快。Polars迁移指南说明,它能并行执行许多操作,并在惰性模式下先建立查询计划、再优化执行;使用scan_csv时,若后续计算只需要少数列,读取阶段就能略过其余列,最终由collect触发计算。

连续的筛选、连接和聚合因此是值得尝试的范围:计算计划能看见前后步骤,才有机会减少不必要的读取和中间结果。反过来,若每一步都立即生成DataFrame,或频繁调用Python自定义函数,就难以获得同样的计划优化空间。连接键的重复程度、筛选后剩余的行数以及内存余量,都会影响具体收益。

改写时应先描述需要哪些输入列、怎样筛选、按什么键连接以及最终输出什么,而不是逐行寻找与pandas同名的方法。若原流程只在一处慢,保留周围已稳定的代码,可以把结果差异和性能差异都限定在较小范围。这样得到的是可比较的一段计算,而不是同时改变数据读取、处理和交付方式。

什么时候继续用pandas更合算

文本处理尤其需要按实际版本重新判断。pandas 3.0版本说明写明,字符串列默认推断为专用str类型;安装PyArrow时可使用其后端,否则回退到基于NumPy object的实现。该版本还默认采用写时复制语义,并初步支持pd.col()表达式。旧版字符串列的运行结果因此不宜直接代替升级后的测量,而类型判断和赋值行为也需要核对。

连接套件测量的是表间匹配,无法推出正则提取、文本清洗或交互式抽样会获得相同倍数。对于短时间即可完成的小表任务,人的分析和改写时间也可能比计算等待更重要。若团队经常依靠pandas索引对齐数据,或现有统计与绘图函数直接消费pandas对象,迁移还会带来接口调整和维护成本。

这并不意味着pandas适合所有已经能运行的流程。判断应落在实际耗时和改写范围上:当作业的主要等待来自多GB连接或分组时,保持原状也有持续成本;当主要工作是探索、文本操作和调用既有工具时,孤立的连接跑分不足以支持全面改写。

迁移API时,哪些结果需要重新核对

索引是最容易被忽略的语义差异。pandas可以让行索引承担对齐或业务键的作用,Polars则没有同样的行索引;迁移时应把相关键显式保存在列中。原来靠索引对应的赋值、连接和分组,需要按业务键检查重复记录、未匹配行与输出行数,不能只看代码是否成功运行。

缺失值和类型也会改变结果。pandas会依列类型使用不同的缺失值表示;Polars以null表示缺失,同时把浮点NaN视作另一种值。原有整数列出现缺失值后是否保持整数、空值是否参与计算、连接或聚合后的顺序是否被下游依赖,都应与现有结果逐项对齐。对顺序有要求的交付结果,应把排序写成明确条件。

比较性能时,输入数据、筛选条件和交付结果必须一致。记录读取、连接、分组、转换和写出各段耗时,才能判断加速发生在关键路径,还是把时间转移到了格式交接处。结果校验则应覆盖高重复连接键、空值、行数、数值类型和必要的排序;这些检查直接决定迁移后的数据是否仍可供下游使用。

混合使用的边界在哪里

混用的合理边界通常是让Polars完成大表变换,待结果缩小后再交给现有pandas工具。to_pandas接口说明指出,默认转换会复制数据;启用use_pyarrow_extension_array可保留空值并允许零拷贝转换,但后续pandas操作若无法使用PyArrow计算函数,仍可能触发转换。

因此,转换点应设在数据明显缩小、下游确实需要pandas对象的位置。在每次筛选或聚合之间来回转换,会增加时间和内存开销,也让两套缺失值与类型语义更难追踪。若最终只向一个绘图或建模环节交付较小结果,边界则清楚得多。

选型可以据此收束:大表连接或分组占据主要耗时,且输出能按业务键与类型对齐时,先迁移该段;若完整流程的时间主要花在输入输出、轻量交互或反复格式交接上,继续使用pandas通常更省工作。决定扩大迁移范围的依据,应是完整作业稳定节省的时间,而不是某一道基准题的倍数。

相关阅读:

分享:

订阅我们的新闻通讯

将最新 Web3、AI 和加密货币新闻直接发送到您的邮箱。

0