Pythonは、基盤となるシステムアーキテクチャに基づいて整数を自動的に割り当てます。残念ながら、メモリに完全にロードする必要がある巨大なデータセットがあります。
それで、Pythonにいくつかの整数(C ++'short'に相当)に2バイトだけを使用させる方法はありますか?
Pythonは、基盤となるシステムアーキテクチャに基づいて整数を自動的に割り当てます。残念ながら、メモリに完全にロードする必要がある巨大なデータセットがあります。
それで、Pythonにいくつかの整数(C ++'short'に相当)に2バイトだけを使用させる方法はありますか?
いいえ。ただし、配列では短整数を使用できます。
from array import array
a = array("h") # h = signed short, H = unsigned short
値がその配列にある限り、それは短整数になります。
「配列」モジュールを指摘してくれた Armin に感謝します。また、C スタイルの構造体を文字列にパックする「構造体」モジュールも見つけました。
ドキュメントから ( https://docs.python.org/library/struct.html ):
>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8
Armin の array モジュールの提案がおそらく最良です。次の 2 つの方法があります。
また、Python 整数オブジェクトは 4 バイトではないことに注意してください。追加のオーバーヘッドがあります。そのため、非常に多数の short がある場合は、何らかの方法 (たとえば array モジュール) で C short を使用することにより、数値ごとに 2 バイト以上を節約できます。
しばらく前に整数の大きなセットをメモリに保持する必要があり、整数のキーと値を含むディクショナリが大きすぎました (データ構造 IIRC に 1GB を使用できました)。IIBTree (ZODB から) を使用するように切り替え、なんとか収まりました。(IIBTree の int は、Python の整数ではなく、実際の C の int です。数値が 32 ビットを超えると、IOBTree への自動切り替えをハックしました)。