可以在不到12个字节的情况下存储Python内联?

时间:2012-11-15 07:54:06

标签: python int

是否可以让Python使用少于12个字节的int?

>>> x=int()
>>> x
0
>>> sys.getsizeof(x)
12

我不是计算机专家,但不是12字节过多?

我想要存储的最小int是0,最大的int 147097614,所以我真的不需要超过4个字节。

(我可能会误解这里,因为我无法在网上找到任何答案。记住这一点。)

3 个答案:

答案 0 :(得分:10)

在python中,int就像其他一切一样是对象。因此,与您使用具有一些关联元数据的对象相关的事实会产生一些额外的开销。

如果您要使用 lot 的整数,并且将它们放在类似数组的结构中是有意义的,那么您应该查看numpy。对于数组对象跟踪的各种元数据,Numpy ndarray对象将有一些与它们相关的开销,但实际数据将存储为您指定的数据类型(例如numpy.int32 for一个4字节的整数。)

因此,如果你有:

import numpy as np
a = np.zeros(5000,dtype=np.int32)

数组只占用内存的4*5000 = 20000个字节

答案 1 :(得分:7)

整数对象的大小包括维护其他对象信息及其值的开销。附加信息可以包括对象类型,引用计数和其他特定于实现的详细信息。

如果您存储了许多整数并希望优化所花费的空间,请使用array module,特别是使用array.array('i')构建的数组。

答案 2 :(得分:5)

python中的整数是对象,因此存储有额外的开销。

您可以阅读有关它的更多信息here

cpython中的整数类型存储在如下结构中:

typedef struct {
  PyObject_HEAD
  long ob_ival;
} PyIntObject;

PyObject_HEAD是一个扩展为引用计数的宏和一个指向类型对象的指针

所以你可以看到:

  • long ob_ival - 长达4个字节。
  • Py_ssize_t ob_refcnt - 我假设size_t这里是4个字节。
  • PyTypeObject *ob_type - 是指针,所以另外4个字节。

总共12个字节!