array.array
またはを扱っていない限りnumpy.array
、サイズには常にオブジェクトのオーバーヘッドがあります。そして、Python は BigInts を自然に処理するため、それを判断するのは非常に困難です...
>>> i = 5
>>> import sys
>>> sys.getsizeof(i)
24
したがって、64 ビット プラットフォームでは、3 ビットで格納できるデータを格納するには 24 バイトが必要です。
しかし、あなたがした場合、
>>> s = '\x05'
>>> sys.getsizeof(s)
38
いいえ、そうではありません-object
生のストレージではなく、定義のメモリオーバーヘッドがあります...
次に取る場合:
>>> a = array.array('i', [3])
>>> a
array('i', [3])
>>> sys.getsizeof(a)
60L
>>> a = array.array('i', [3, 4, 5])
>>> sys.getsizeof(a)
68L
次に、通常のバイト境界などと呼ばれるものを取得します...など...など...
「純粋に」格納する必要があるものだけが必要な場合は、オブジェクトのオーバーヘッドを差し引いて、2.(6|7) から使用できますsome_int.bit_length()
(そうでない場合は、他の回答が示しているようにビットシフトするだけです)。