5

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

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

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

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

(我可能在这里误解了一些东西,因为我在网上的任何地方都找不到答案。请记住这一点。)

4

3 回答 3

10

在 python 中,ints 和其他所有东西一样是对象。正因为如此,有一点额外的开销与您正在使用具有一些关联元数据的对象这一事实相关。

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

因此,如果您有:

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

该数组仅占4*5000 = 20000用您的内存字节数

于 2012-11-15T07:57:55.997 回答
7

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

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

于 2012-11-15T07:59:42.747 回答
5

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

您可以在此处阅读有关它的更多信息

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

typedef struct {
  PyObject_HEAD
  long ob_ival;
} PyIntObject;

PyObject_HEAD是一个扩展为引用计数指向类型 object的指针的宏。

所以你可以看到:

  • long ob_ival- 4 个字节长。
  • Py_ssize_t ob_refcnt- 我假设这里的 size_t 是 4 个字节。
  • PyTypeObject *ob_type- 是一个指针,所以还有 4 个字节。

总共12个字节!

于 2012-11-15T07:59:53.730 回答