2015-12-22 23 views
5

私は、メモリ内操作のためにおそらく大きな辞書をPython 3で構築しようとしています。辞書のキーは整数ですが、最初は文字列としてファイルから読み込みます。Python辞書のキータイプのトレードオフ

保存と検索に関しては、辞書キーを整数として格納するのか、文字列として格納するのかが問題になるのだろうかと思います。
言い換えれば、それらを整数として残すと、ハッシュに役立つでしょうか?

+0

整数を表す場合、値をintではなく文字列として格納するとどのような利点がありますか? 'my_dict [str(my_val)]'のような複雑なコードをどこにでも置いておきたい場合は、これが最善の方法です。これらが整数の場合は、ファイルに情報を格納する方法にかかわらず、 'int'を使います。 – Holt

+1

後で整数として使用する場合は整数を使用し、後で文字列として使用する場合は文字列を使用します。 – poke

+0

@pokeの答えは最も正確だと私は思います – Ramast

答えて

1

実際には文字列のハッシュが、私はこれが逆の結果を有することが期待のPython 3でかなり効率的である:

>>> timeit('d["1"];d["4"]', setup='d = {"1": 1, "4": 4}') 
0.05167865302064456 
>>> timeit('d[1];d[4]', setup='d = {1: 1, 4: 4}') 
0.06110116100171581 
3

Dictsは高速ですが、メモリ上に重いことができます。 通常は問題ではありませんが、テスト時のみ知ることができます。 私は最初に1.000行、10.000行などをテストし、メモリフットプリントを調べることをお勧めします。

メモリが足りなくなり、データ構造が許容される場合は、named tuplesを試してみてください。

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') 
import csv 
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): 
    print(emp.name, emp.title) 

(リンクから取られた例)

あなたはまたarray moduleを使用して、より空想を取得しようとすることができ、整数を昇順ている場合。

1

あなたはベンチマーキングの選択肢を気にしていないようです。違いはごくわずかであり、矛盾する点もあることがわかります。整数と文字列の両方が不変であり、ポインタとして比較される可能性があるため、実装方法の詳細は実装されています。

あなたが考慮すべきことは、どちらが鍵の自然な選択であるかです。たとえば、キーを他の場所の数字として解釈しないと、それを整数に変換する理由はほとんどありません。

さらに、数値が同じであるか、またはそれらが字句的に同じである必要がある場合、キーが等しいと見なすかどうかを検討する必要があります。たとえば、00と同じキーを0と考えると、それを整数と解釈してから整数を正しいキーにする必要があります。一方、それらを異なるものと見なしたい場合は整数に変換するのが間違っています(彼らは同じになるだろうとして)。