5

Pythonがintに12バイト未満を使用するようにすることは可能ですか?

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

私はコンピューターの専門家ではありませんが、12バイトが多すぎませんか?

保存したい最小のintは0、最大のint 147097614なので、実際には4バイトを超える必要はありません。

(ネット上で答えが見つからなかったので、ここで誤解していることがあるかもしれません。覚えておいてください。)

4

3 に答える 3

10

Pythonでは、intsは他のすべてと同じようにオブジェクトです。そのため、メタデータが関連付けられているオブジェクトを使用しているという事実に関連して、少し余分なオーバーヘッドが発生します。

多くのintを使用する予定であり、それらを配列のような構造に配置することが理にかなっている場合は、を調べる必要がありますnumpy。Numpyndarrayオブジェクトには、配列オブジェクトが追跡するさまざまなメタデータのオーバーヘッドが少しありますが、実際のデータは、指定したデータ型(numpy.int324バイト整数など)として保存されます。

したがって、次の場合:

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は、参照カウント型オブジェクトへのポインタに展開されるマクロです。

だからあなたはそれを見ることができます:

  • long ob_ival-長い場合は4バイト。
  • Py_ssize_t ob_refcnt-ここでsize_tは4バイトだと思います。
  • PyTypeObject *ob_type-ポインタなので、さらに4バイト。

合計12バイト!

于 2012-11-15T07:59:53.730 に答える