Python中的短整数

时间:2020-03-06 14:35:29  来源:igfitidea点击:

Python根据基础系统体系结构自动分配整数。不幸的是,我有一个庞大的数据集,需要将其完全加载到内存中。

因此,是否有一种方法可以强制Python对某些整数(相当于C ++" short")仅使用2个字节?

解决方案

没有。但是我们可以在数组中使用短整数:

from array import array
a = array("h") # h = signed short, H = unsigned short

只要该值保留在该数组中,它将是一个短整数。

  • 阵列模块的文档

感谢Armin指出"数组"模块。我还找到了" struct"模块,该模块将c样式的结构打包在一个字符串中:

从文档(https://docs.python.org/library/struct.html):

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

Armin对阵列模块的建议可能是最好的。两种可能的选择:

  • 我们可以自己创建扩展模块,以提供所需的数据结构。如果确实只是短裤集合之类的东西,那么这很简单。
  • 我们可以作弊和操纵位,以便在Python int的下半部分存储一个数字,在上半部分存储另一个数字。我们将编写一些实用程序函数以在数据结构中与这些函数进行相互转换。丑陋,但可以使它工作。

还值得意识到的是,Python整数对象不是4个字节,因此存在额外的开销。因此,如果我们有大量的短裤,则可以通过某种方式使用C短裤(例如数组模块)为每个数字节省两个以上的字节。

不久前,我不得不在内存中保留大量整数,并且包含整数键和值的字典太大(我有1GB的数据结构可用于IIRC)。我转而使用IIBTree(来自ZODB)并设法适应它。 (IIBTree中的整数是真实的C整数,而不是Python整数,当数字大于32位时,我破解了自动切换到IOBTree的方法)。

@Armin:怎么来的? Python文档说,该短整数数组的最小大小为2个字节,

The actual representation of values is
  determined by the machine architecture
  (strictly speaking, by the C
  implementation). The actual size can
  be accessed through the itemsize
  attribute.

@Arnav:我建议代码应检查每个Type代码的大小,并选择特定于底层系统的相应2字节类型。