[ PROMPT_NODE_27020 ]
best_practices
[ SKILL_DOCUMENTATION ]
# Polars 最佳实践与性能指南
编写高效 Polars 代码并避免常见陷阱的综合指南。
## 性能优化
### 1. 使用惰性求值
**对于大数据集,始终优先使用惰性模式:**
python
# 差:即时模式立即加载所有内容
df = pl.read_csv("large_file.csv")
result = df.filter(pl.col("age") > 25).select("name", "age")
# 好:惰性模式在执行前进行优化
lf = pl.scan_csv("large_file.csv")
result = lf.filter(pl.col("age") > 25).select("name", "age").collect()
**惰性求值的优势:**
- 谓词下推(在源头过滤)
- 投影下推(仅读取所需列)
- 查询优化
- 并行执行规划
### 2. 尽早过滤和选择
在流水线中尽早进行过滤和列选择:
python
# 差:处理所有数据,然后过滤和选择
result = (
lf.group_by("category")
.agg(pl.col("value").mean())
.join(other, on="category")
.filter(pl.col("value") > 100)
.select("category", "value")
)
# 好:尽早过滤和选择
result = (
lf.select("category", "value") # 仅需的列
.filter(pl.col("value") > 100) # 尽早过滤
.group_by("category")
.agg(pl.col("value").mean())
.join(other.select("category", "other_col"), on="category")
)
### 3. 避免使用 Python 函数
保持在表达式 API 内以维持并行化:
python
# 差:Python 函数禁用了并行化
df = df.with_columns(
result=pl.col("value").map_elements(lambda x: x * 2, return_dtype=pl.Float64)
)
# 好:使用原生表达式(已并行化)
df = df.with_columns(result=pl.col("value") * 2)
**当必须使用自定义函数时:**
python
# 如果确实需要,请显式说明
df = df.with_columns(
result=pl.col("value").map_elements(
custom_function,
return_dtype=pl.Float64,
skip_nulls=True # 优化空值处理
)
)
### 4. 对超大数据集使用流式处理 (Streaming)
对于大于内存的数据集,启用流式处理:
python
# 流式模式分块处理数据
lf = pl.scan_parquet("very_large.parquet")
result = lf.filter(pl.col("value") > 100).collect(streaming=True)
# 或使用 sink 进行直接流式写入
lf.filter(pl.col("value") > 100).sink_parquet("output.parquet")
### 5. 优化数据类型
选择合适的数据类型以减少内存占用并提高性能:
python
# 差:默认类型可能造成浪费
df = pl.read_csv("data.csv"