惰性API

Polars支持两种操作模式: lazyeager, 之前的示例都使用了 eager, 查询会立即执行 在Lazy模式中, 查询仅用来收集, 将执行推迟到最后执行

  • eager模式的每个步骤都会立即执行, 返回中间结果
  • lazy模式会收集所有查询步骤, 查询优化器可以执行各种优化, 会显著降低内存和CPU的负载, 从而允许在内存中容纳更大的数据集
NOTE
  • 很多情况下, eager实际上实在后台调用lazy并立即收集结果
  • 一般来说, lazy模式是首选的, 除非对中间结果感兴趣, 或者在做探索性工作

预览查询计划

使用lazyapi时可以使用函数explain要求Polars创建查询计划的描述, 该描述将在收集结果后执行.

使用lazy模式

TIP
  • 以下只是简单示例如何使用, 具体是否使用lazy模式取决于数据集大小和查询
  • 数据集小时, 使用eager模式可能会更快, 因为生成查询计划需要时间

可以使用lazy()方法将DataFrame转换为LazyDataFrame.

最后使用collect()收集所有查询步骤并返回结果

1import polars as pl
2
3df: pl.DataFrame = pl.DataFrame({
4    "name": ["Alice", "Bob", "Charlie", "David"],
5    "age": [25, 35, 30, 40],
6    "city": ["NY", "LA", "NY", "SF"]
7})
8
9lazy_df: pl.LazyFrame = df.lazy()
10
11query = (
12    lazy_df
13    .filter(pl.col("age") > 30)
14    .select(pl.col("name"),pl.col("age"))
15)
16print(query.explain())
17print(query.collect())
1FILTER [(col("age")) > (30)]
2FROM
3  DF ["name", "age", "city"]; PROJECT["name", "age"] 2/3 COLUMNS
4shape: (2, 2)
5┌───────┬─────┐
6│ name  ┆ age │
7│ ---   ┆ --- │
8│ str   ┆ i64 │
9╞═══════╪═════╡
10│ Bob   ┆ 35  │
11│ David ┆ 40  │
12└───────┴─────┘