Python中的短整数

时间:2008-09-23 10:35:10

标签: python memory-management short

Python根据底层系统架构自动分配整数。不幸的是,我有一个庞大的数据集需要完全加载到内存中。

那么,有没有办法强制Python只为一些整数使用2个字节(相当于C ++'short')?

6 个答案:

答案 0 :(得分:35)

不。但是你可以在数组中使用短整数:

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

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

答案 1 :(得分:5)

感谢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

答案 2 :(得分:2)

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

  • 您可以自己创建一个扩展模块,提供您所追求的数据结构。如果它真的只是一组短裤,那么 这很简单。
  • 你可以 欺骗和操纵位,这样 你正在存储一个号码 Python int的下半部分,和 另一个在上半部分。 你会写一些实用功能 在你的内容中转换为/从这些转换 数据结构。丑陋,但它可以工作。

同样值得注意的是,Python整数对象不是4个字节 - 还有额外的开销。因此,如果你有非常多的短路,那么你可以通过某种方式使用C short来节省每个数字超过两个字节(例如阵列模块)。

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

答案 3 :(得分:2)

您可以将NumyPy的int用作np.int8或np.int16。

答案 4 :(得分:1)

您还可以在单​​个大整数中存储多个任意大小的整数。

例如,如下所示,在64位x86系统上的python3中,1024位占用了164个字节的内存存储空间。这意味着平均一个字节可以存储大约6.24位。而且,如果使用更大的整数,则可以获得更高的位存储密度。例如,每字节约7.50位,具有2 ** 20位宽的整数。

显然,您将需要一些包装逻辑来访问存储在较大整数中的单个短数字,这很容易实现。

此方法的一个问题是,由于使用大整数运算,您的数据访问速度会变慢。

如果您要一次访问一大批连续存储的整数以最大程度地减少对大整数的访问,那么对长整数的较慢访问将不是问题。

我想使用numpy会更容易。

>>> a = 2**1024
>>> sys.getsizeof(a)
164
>>> 1024/164
6.2439024390243905

>>> a = 2**(2**20)
>>> sys.getsizeof(a)
139836
>>> 2**20 / 139836
7.49861266054521

答案 5 :(得分:1)

在python中使用bytearray基本上是在幕后使用C无符号char数组,这比使用大整数更好。操作字节数组没有开销,并且与大整数相比,它的存储开销要少得多。使用字节数组可以获得每字节7.99+位的存储密度。

>>> import sys
>>> a = bytearray(2**32)
>>> sys.getsizeof(a)
4294967353
>>> 8 * 2**32 / 4294967353
7.999999893829228