Python中的内存高效变量类型

时间:2015-10-20 23:24:52

标签: python

我在python中是全新的,我有两个关于记忆的问题。

首先:

我可以为每个变量准确存储2位还是比int更少的内存? 我的程序只适用于值0,1,2,3,我想节省内存。

getsizeof(1)   //12 bytes
getsizeof('A') //22 bytes, but I expected 2 bytes as char :(

由于2位,每个变量需要12或22个字节。有可能在pyhton中解决这个问题吗?

第二个类似的问题:

我尝试实现树数据结构,其中每个节点有4个子节点,顺序正确。 例如理想像dict:

node = {1: None, 2: None, 3: None, 4: None}
getsizeof(node) //57 bytes

或在数组中:

node = [None, None, None, None]
getsizeof(node) //52 bytes, where getsizeof([]) = 36 bytes

实际上,每个节点都将无用地包含36个字节。它是〜3.35Gb,有1 000 000 000个节点。有没有办法节省记忆?

1 个答案:

答案 0 :(得分:1)

第二个问题是指针的问题,委托给C或其他语言不是解决方案,因为指针总是需要8或4个字节(取决于架构)。另外,我假设使用64b python进行数十GB的工作,因此几乎每个变量类型都会大约2倍。

例如:

node = [None, None, None, None]
node = [[[None, None, None, None], None, None, None], None, None, None]

每个“None”都可以引用另一个节点(指针),因此不可能以这种方式进行优化。如果你确定叶子的数量将是例如少于~65K,那么你可以减少(~4倍)并根据需要修改64b架构上的指针大小。

第一个问题的问题类似(指针总是占用必要的空间),解决方案是使用位数组或使用位操作,并尝试在一个变量中存储更多值。但是,如果有必要在某些结构中准确存储例如2个字节的值,那么例如在数组中,它在python中不具有内存效率。