Modin 与 pandas 有何不同?#
注意
在之前的教程中,我们已经看到了如何使用Modin来加速pandas的工作流程。在这里,我们从高层次上讨论Modin的工作原理,特别是Modin的数据帧实现与pandas有何不同。
实现的可扩展性#
Modin 通过 modin.pandas 暴露了 pandas 的 API,但它并没有继承那些使其难以扩展的相同缺陷和设计决策。
pandas 的实现本质上是单线程的。这意味着在任何给定时间只能利用一个 CPU 核心。在笔记本电脑上,使用 pandas 时的情况可能如下所示:
然而,Modin 的实现使您能够使用机器上的所有核心,或者整个集群中的所有核心。在笔记本电脑上,它将看起来像这样:
额外的利用率带来了性能的提升,然而,如果你想扩展到整个集群,Modin 突然看起来像这样:
Modin 能够高效地利用所有可用的硬件!
内存使用和不可变性#
pandas API 包含许多“就地”更新的情况,这些情况众所周知是有争议的。这部分是由于 pandas 管理内存的方式:用户可能认为他们在节省内存,但无论操作是否是就地进行的,pandas 通常都会复制数据。
Modin 允许原地语义,但与 pandas 不同,Modin 实现中的底层数据结构是不可变的。这种不可变性使 Modin 能够在内部链接操作符并更好地管理内存布局,因为它们不会被更改。由于能够在所有数据帧之间共享公共内存块,这在许多常见情况下比 pandas 在内存使用方面有所改进。
Modin通过拥有一个指向不可变内部Modin数据帧的可变指针来提供就地语义。这个指针可以改变,但底层数据不能改变,因此当触发就地更新时,Modin会将其视为非就地更新,并仅更新指向结果Modin数据帧的指针。
API 与实现#
众所周知,pandas API 包含许多执行相同操作的重叠方式。而 Modin 则强制要求任何行为在内部只有一个实现。这一保证使 Modin 能够专注于并优化较小的代码足迹,同时仍保证覆盖整个 pandas API。Modin 有一个内部代数,大约有 15 个操作符,从 pandas 中原本存在的 200 多个操作符中精简而来。该代数基于实践和理论工作。了解更多信息,请参阅我们的 VLDB 2020 论文。有关此代数的更多信息可以在 架构 文档中找到。