【问题标题】:Possible to store Python ints in less than 12 bytes?可以将 Python 整数存储在 12 个字节以内吗?
【发布时间】:2012-11-15 07:54:06
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 谢谢。那里有有趣的信息,但幸运的是不是重复的,AFAICS。
  • 如果您认为 12 字节过多,请等到您在需要 24 字节的 64 位架构上尝试一下!

标签: python int


【解决方案1】:

在 python 中,ints 和其他所有东西一样都是对象。因此,您使用的对象具有一些关联的元数据,因此会产生一些额外的开销。

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

因此,如果你有:

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

该数组只占用您内存的4*5000 = 20000 字节多一点

【讨论】:

  • 一个很好的答案;请注意,不必依赖 numpy 来有效地存储大量整数。 array 模块提供了一个轻量级(但功能较少)的替代方案,可在标准库中找到。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    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 个字节!

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2010-12-30
      相关资源
      最近更新 更多