26

Pythonは、基盤となるシステムアーキテクチャに基づいて整数を自動的に割り当てます。残念ながら、メモリに完全にロードする必要がある巨大なデータセットがあります。

それで、Pythonにいくつかの整数(C ++'short'に相当)に2バイトだけを使用させる方法はありますか?

4

6 に答える 6

40

いいえ。ただし、配列では短整数を使用できます。

from array import array
a = array("h") # h = signed short, H = unsigned short

値がその配列にある限り、それは短整数になります。

于 2008-09-23T10:36:44.307 に答える
5

「配列」モジュールを指摘してくれた 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
于 2008-09-23T11:34:37.740 に答える
3

Armin の array モジュールの提案がおそらく最良です。次の 2 つの方法があります。

  • 必要なデータ構造を提供する拡張モジュールを自分で作成できます。それが本当にショーツのコレクションのようなものであれば、それは非常に簡単です.
  • Python int の下半分に 1 つの数値を格納し、上半分に別の数値を格納するように、ビットをごまかして操作することができます。データ構造内でこれらとの間で変換するユーティリティ関数をいくつか作成します。醜いですが、機能させることができます。

また、Python 整数オブジェクトは 4 バイトではないことに注意してください。追加のオーバーヘッドがあります。そのため、非常に多数の short がある場合は、何らかの方法 (たとえば array モジュール) で C short を使用することにより、数値ごとに 2 バイト以上を節約できます。

しばらく前に整数の大きなセットをメモリに保持する必要があり、整数のキーと値を含むディクショナリが大きすぎました (データ構造 IIRC に 1GB を使用できました)。IIBTree (ZODB から) を使用するように切り替え、なんとか収まりました。(IIBTree の int は、Python の整数ではなく、実際の C の int です。数値が 32 ビットを超えると、IOBTree への自動切り替えをハックしました)。

于 2008-09-23T11:35:15.227 に答える