web-dev-qa-db-ja.com

Pythonの短い整数

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

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

17
Arnav

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

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

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

35
Armin Ronacher

'array'モジュールを指摘してくれたArminに感謝します。また、cスタイルの構造体を文字列にパックする「struct」モジュールも見つかりました。

ドキュメントから( 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
5
Arnav

アレイモジュールに関するArminの提案はおそらく最良です。 2つの可能な選択肢:

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

Python整数オブジェクトは4バイトではなく、追加のオーバーヘッドがあることも理解しておく価値があります。したがって、ショートの数が非常に多い場合は、次の方法で数値ごとに2バイト以上節約できます。何らかの方法でCshortを使用します(例:アレイモジュール)。

しばらく前に大量の整数のセットをメモリに保持する必要があり、整数のキーと値を持つ辞書が大きすぎました(データ構造IIRCに1GBを使用できました)。 IIBTree(ZODBから)の使用に切り替えて、なんとか適合させました。 (IIBTreeのintは実数のC intであり、Python整数であり、数値が32ビットより大きい場合はIOBTreeへの自動切り替えをハックしました)。

2
Tony Meyer