Python根据底层系统架构自动分配整数。不幸的是,我有一个需要完全加载到内存的大型数据集。
那么,有没有办法强制Python只使用2字节来表示某些整数(相当于C++中的“short”)?
Python根据底层系统架构自动分配整数。不幸的是,我有一个需要完全加载到内存的大型数据集。
那么,有没有办法强制Python只使用2字节来表示某些整数(相当于C++中的“short”)?
不行。但是,您可以在数组中使用短整数:
from array import array
a = array("h") # h = signed short, H = unsigned short
>>> 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整数对象不是4个字节 - 还有额外的开销。因此,如果您有大量的shorts,则可以通过某种方式使用C short来每个数字节省超过两个字节(例如使用数组模块)。
我之前必须在内存中保存大量的整数,使用整数键和值的字典过大(我记得为该数据结构提供了1GB)。我切换到使用IIBTree(来自ZODB),并设法适应它。(IIBTree中的整数是真正的C int,而不是Python整数,并且当数字大于32位时,我会自动切换到IOBTree)。
>>> a = 2**1024
>>> sys.getsizeof(a)
164
>>> 1024/164
6.2439024390243905
>>> a = 2**(2**20)
>>> sys.getsizeof(a)
139836
>>> 2**20 / 139836
7.49861266054521
在Python中使用bytearray,它基本上是C语言无符号字符数组的实现方式,比使用大整数更好。操作字节数组没有额外开销,并且与大整数相比,它具有更少的存储开销。使用bytearrays可以获得每字节7.99+位的存储密度。
>>> import sys
>>> a = bytearray(2**32)
>>> sys.getsizeof(a)
4294967353
>>> 8 * 2**32 / 4294967353
7.999999893829228