polars的内存效率声明不是关于静态数据,而是关于对数据执行操作的内存开销。 Here's a good demo of that 截图:x1c 0d1x 您可以看到,在左侧,Polars需要大约2秒,并且内存使用量略有增加(可能是~5%)。在右边,pandas需要大约40秒,需要大约20%的系统内存。polars更快的原因是双重的。正如你所看到的,在polars方面,所有的CPU线程都将达到100%,但在pandas方面,每次只有1个线程,而且它们甚至没有持续。第二个原因是内存效率低下意味着它不必要地复制,这很慢。
速度提高20倍,内存使用量是pandas的25%。
顺便说一下问题中提到的速度差异。polars本身并不读取数据库,它使用connectorx库,该库使用一些优化,通过创建块并并行获取这些块来更快地加载数据。您可以在这里阅读有关内容。如果数据库后端无法更快地处理执行查询,那么尝试以块的方式执行查询可能会比让查询作为单个查询发生更慢。调用。此外,如前所述,数据库查询是先用polars,然后用pandas after 完成的。数据库通常会缓存结果,所以如果你连续运行同一个查询两次,第二次会更快,不管是哪个第三方库进行查询。
2条答案
按热度按时间c3frrgcw1#
polars的内存效率声明不是关于静态数据,而是关于对数据执行操作的内存开销。
Here's a good demo of that
截图:x1c 0d1x
您可以看到,在左侧,Polars需要大约2秒,并且内存使用量略有增加(可能是~5%)。在右边,pandas需要大约40秒,需要大约20%的系统内存。polars更快的原因是双重的。正如你所看到的,在polars方面,所有的CPU线程都将达到100%,但在pandas方面,每次只有1个线程,而且它们甚至没有持续。第二个原因是内存效率低下意味着它不必要地复制,这很慢。
速度提高20倍,内存使用量是pandas的25%。
顺便说一下问题中提到的速度差异。polars本身并不读取数据库,它使用connectorx库,该库使用一些优化,通过创建块并并行获取这些块来更快地加载数据。您可以在这里阅读有关内容。如果数据库后端无法更快地处理执行查询,那么尝试以块的方式执行查询可能会比让查询作为单个查询发生更慢。调用。此外,如前所述,数据库查询是先用polars,然后用pandas after 完成的。数据库通常会缓存结果,所以如果你连续运行同一个查询两次,第二次会更快,不管是哪个第三方库进行查询。
4nkexdtk2#
Polars的一大优势是查询优化
如果您使用
read_database
将所有数据加载到内存中,并且仅执行此操作,则不会有任何差异另一方面,如果你让你读到的数组为lazy(
DataFrame.lazy
),然后执行一些其他的操作,然后收集结果(LazyFrame.collect
),那么这就是Polars的亮点所在注意:通常你会想直接延迟读取数据(例如
scan_parquet
而不是read_parquet
),但是对于read_database
,没有scan_
等价物