对于 ID 最合适/最高效的 p​​andas 数据类型是什么?

Con*_*ors 5 python performance dataframe python-3.x pandas

可能很明显,但只是想确认一下:

pandas 中最适合数字 ID 的数据类型是什么?

假设我有一个顺序数字 ID 类型user_id,这会更好:

  • 一种int64类型(考虑到字段的数字表示,这似乎是最明显的选择)
  • 类型category(这可能更有意义,因为 ID 不用于实际的数字运算,而是作为唯一标识符)

对于基于字符的 ID 同样的问题,使用 anobject或category类型会更好吗?

我很想使用该category数据类型(认为可能会有性能优势,因为我想象这些类别在某种程度上经过优化/散列/索引以提高性能),但我想知道这种数据类型是否更适合更有限的子集与我的数据集中可能有的数百个唯一 user_ids 不同的值。

谢谢!

Jér*_*ard 4

对对象类型的数据帧/数组进行操作很慢,因为 Pandas 需要使用低效的 CPython解释器对每个项目进行操作。由于引用计数、内部指针间接、类型检查、内部函数调用等,这会导致较高的开销。Pandas 经常在内部使用 Numpy,当类型是本机类型(如 、 、 等)时,int64Numpyint32会更快float64。在这种情况下,Numpy 可以执行优化的本机代码,该代码不会因 CPython 开销而减慢速度,甚至可以从硬件 SIMD 单元中受益(关于所使用的目标函数)。虽然 Numpy 支持有界字符串,但 Pandas 不使用此功能,而是使用慢速 CPython 字符串对象。字符串本质上很慢,即使在本机代码中也是如此,因为它们的大小通常是可变的,而且通常是可预测的(这强烈影响需要预测分支的处理器,因此要快,请参阅这篇关于分支预测的文章)。实际上,unicode 字符使字符串变得更慢(这使得 SIMD 指令的使用变得非常困难,并且分支更难以预测)。类别基本上是与映射表(具有唯一值)相关联的整数。理论上,分类列对于某些计算来说可以更快,因为表已经被计算过。然而,表的初始计算可能会很昂贵。此外,该表并不总是有效使用,有时可能会导致执行速度比整数慢得多。更不用说当所有值都不同时,表可能会很大。整数是较便宜的类型。较小的整数通常会更快。事实上,SIMD 向量具有固定大小(例如,86-64 个处理器的 AVX-2 SIMD 指令集可以int8连续计算 32 个值,而只能计算 4 个值int64)。此外,较小的项目会导致整个列占用较少的内存,从而降低内存吞吐量,从而提高内存绑定代码的性能(从 Pandas 中非常频繁的数据帧副本开始)。然而,这并不总是更快,因为较小的类型有时会导致类型转换增加额外的开销(尽管可以使用较低级别的优化来减轻这种开销)。因此,如果您正在处理巨大的数据帧,请考虑使用小整数类型。否则,int64肯定是一个非常好的选择。