Polars支持两种操作模式: lazy
和 eager
, 之前的示例都是使用的 eager
, 即查询会立即执行。 但在Lazy模式中, 查询只会在使用了collect
后执行。将执行推迟到最后一刻可以带来显著的性能优势,这也是为什么在大多数情况下首选惰性执行 (lazy) API 的原因。
eager模式:立即执行查询,适合需要看中间数据的情况。
lazy模式:惰性查询,只会在最后才进行查询。
下载官方提供的数据集 官方数据文件格式和官方文档上已经有点不一样了,所以需要手动处理一下。将iris.data文件改为iris.csv,并且在最开始一行加入表头:sepal_length,sepal_width,height,width,species。主要是几个后续用到的列名称,其他列的名称无所谓。如下所示:
在此示例中,使用 Eager API 来执行操作流程如下:
每个步骤都会立即执行并返回中间结果。这可能非常消耗资源,因为可能会执行一些工作或加载一些未使用的额外数据。如果改用惰性 API,并等待所有步骤都定义完成后再执行,那么查询规划器就可以进行各种优化。在这种情况下:
这些将显著降低内存和 CPU 的负载,从而能够在内存中容纳更大的数据集并更快地处理它们。定义查询后,可以调用collect
来通知 Polars 要执行该查询。
使用lazy
api时,可以使用函数explain要求Polars
创建查询计划的描述, 该描述将在收集结果后执行。对于用来了解 Polars 对查询做了哪些类型的优化非常有用。用法如下:
然后输出结果如下:
在结果中可以看见,Polars 确实应用了谓词下推,因为它只读取萼片长度大于 5 的行,并且它确实应用了投影下推,因为它只读取查询所需的列。
lazy
模式lazy
模式取决于数据集大小和查询eager
模式可能会更快, 因为生成查询计划需要时间可以使用lazy()
方法将DataFrame转换为LazyDataFrame.
最后使用collect()
收集所有查询步骤并返回结果