Pythonがintに12バイト未満を使用するようにすることは可能ですか?
>>> x=int()
>>> x
0
>>> sys.getsizeof(x)
12
私はコンピューターの専門家ではありませんが、12バイトが多すぎませんか?
保存したい最小のintは0、最大のint 147097614なので、実際には4バイトを超える必要はありません。
(ネット上で答えが見つからなかったので、ここで誤解していることがあるかもしれません。覚えておいてください。)
Pythonでは、int
sは他のすべてと同じようにオブジェクトです。そのため、メタデータが関連付けられているオブジェクトを使用しているという事実に関連して、少し余分なオーバーヘッドが発生します。
多くのintを使用する予定であり、それらを配列のような構造に配置することが理にかなっている場合は、を調べる必要がありますnumpy
。Numpyndarray
オブジェクトには、配列オブジェクトが追跡するさまざまなメタデータのオーバーヘッドが少しありますが、実際のデータは、指定したデータ型(numpy.int32
4バイト整数など)として保存されます。
したがって、次の場合:
import numpy as np
a = np.zeros(5000,dtype=np.int32)
4*5000 = 20000
配列はメモリのバイトよりわずかに多くを消費します
整数オブジェクトのサイズには、その値とともに他のオブジェクト情報を維持するためのオーバーヘッドが含まれます。追加情報には、オブジェクトタイプ、参照数、およびその他の実装固有の詳細を含めることができます。
多くの整数を格納し、使用するスペースを最適化する場合は、array
モジュール、具体的には。で構成された配列を使用しますarray.array('i')
。
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バイト!