Polars DataFrame/LazyFrame高性能应用自定义函数最优方案
Polars 自定义函数高性能应用方案咨询
向Polars的pl.DataFrame或pl.internals.lazy_frame.LazyFrame应用函数的最高效方式是什么?本问题承接自Stack Overflow相关提问《Apply Function to all columns of a Polars-DataFrame》。
现有需求与性能痛点
我当前的需求是拼接所有列后,使用Python标准库hashlib对值进行哈希计算,所用函数如下:
import hashlib def hash_row(row): os.environ['PYTHONHASHSEED'] = "0" row = str(row).encode('utf-8') return hashlib.sha256(row).hexdigest()
该函数要求输入为字符串类型,意味着需要将其应用到pl.Series的每一个单元格:小数据量场景下该方案可正常运行,但当数据量接近1亿行时会出现严重的性能问题。
本次提问的核心:如何以最高性能在整个Polars Series上应用此类自定义函数?
Pandas侧参考实现
Pandas提供了多种创建新列的方式,不同方式性能差异极大:
- 原生向量化调用(性能最优)
df['new_col'] = df['some_col'] * 100 # vectorized calls
- 逐行
apply调用(性能最差)
为逐行逻辑编写自定义函数,通过apply接口指定按行遍历调用:
def apply_func(row): return row['some_col'] + row['another_col'] df['new_col'] = df.apply(lambda row: apply_func(row), axis=1) # using apply operations
- NumPy向量化封装方案(性能优于逐行apply)
基于NumPy的向量化封装实现也是Pandas侧常用的性能优化方案:
import numpy as np def np_func(some_col, another_col): return some_col + another_col vec_func = np.vectorize(np_func) df['new_col'] = vec_func(df['some_col'].values, df['another_col'].values)
待解答问题
针对Polars框架,实现同类逐元素/逐行自定义函数调用的最优解决方案是什么?
内容的提问来源于stack exchange,提问作者Jenobi
相关产品推荐
相关产品推荐

