私のアドバイスは、ビルトインに固執することset()
です。組み込みの C コードに勝るパフォーマンスの Python コードを作成することは非常に困難です。組み込みの C コードに依存している場合、構築の速度と検索の速度が最も速くなります。
並べ替えられたリストの場合、組み込みの並べ替え機能を使用するのが最善の策です。
x = set(seq) # build set from some sequence
lst = sorted(x) # get sorted list from set
一般に、Python では、記述するコードが少ないほど高速になります。Python の組み込み C 基盤に依存できるほど、高速になります。解釈された Python は、多くの場合、C コードよりも 20 倍から 100 倍遅く、ビルトイン機能を意図したとおりに使用するよりも優れているほど賢くなることは非常に困難です。
セットが常に [0, 10] の範囲の整数であることが保証されていて、メモリ フットプリントをできるだけ小さくしたい場合は、整数内のビット フラグが適しています。
pow2 = [2**i for i in range(32)]
x = 0 # set with no values
def add_to_int_set(x, n):
return x | pow2[n]
def in_int_set(x, n):
return x & pow2[n]
def list_from_int_set(x):
return [i for i in range(32) if x & pow2[i]]
これは実際には組み込みset()
関数を使用するよりも遅いに違いありませんが、各セットが単なるint
オブジェクトになることはわかっています: 4 バイトと Python オブジェクトのオーバーヘッドです。
文字通り何十億も必要な場合array
は、Python リストの代わりに NumPy を使用してスペースを節約できます。NumPyarray
は裸の整数を格納するだけです。実際、NumPy には 16 ビットの整数型があるため、セットが実際に [0, 10] の範囲にしかない場合は、NumPy を使用してストレージ サイズをそれぞれ 2 バイトまで減らすことができますarray
。
http://www.scipy.org/FAQ#head-16a621f03792969969e44df8a9eb360918ce9613