2011-02-09 11 views
2

インデックス付きのインスタンス(音楽トラックなど)を操作し、そのインデックス(int-> string)でオブジェクトの名前を検索する必要があります。 Dictsが遅すぎる(私は約10Mのオブジェクトを持っている)。メモリは問題ではないので、最も納得のいく解決方法は、csvファイルから名前付きランダムアクセス配列を作成することです。Pythonの文字列のためのランダムアクセスコンテナ?

しかし、私はこれをPythonで作成できませんでした.0次元の配列(文字列)をインデックスできないというエラーが出ました。文字列用のランダムアクセスコンテナを作成するためのネイティブのPythonの方法は何ですか?

+1

インデックスが '0'から' n-1'まで連続していますか?その場合は、リストを使用してください。それはdictよりずっと速くはありませんが、より速くなります。 –

+7

データベースの仕事のように聞こえる。 ['sqlite'](http://docs.python.org/library/sqlite3.html)を調べましたか? –

+0

@Tim:リストが完全に静的でない方が良いでしょう。 –

答えて

2

私が覚えていることは、Pythonの辞書は平均アクセス時間がO(1)ですが、リストは確実に高速になります。あなたのインデックスがあまり散在していない場合は、次のようなものを試すことができます:

reader = [(1, 'a'), (2, 'b')] # Replace it with your CSV reader. 

# First, fill a dictionary: 
text_dict = {} 
for index, text in reader: 
    text_dict[index] = text 

# Then create a sufficiently large list: 
max_index = max(text_dict.iterkeys()) 
texts = [None] * (max_index + 1) 

# And fill it: 
for index, text in text_dict.iteritems(): 
    texts[index] = text 

print texts 
# prints: [None, 'a', 'b'] 
print texts[1] 
# prints: a 
+0

リストはランダムアクセスの場合はO(1)であり、ジョブにはまったく問題ありません。 DictsもO(1)の読み込みをしますが、定数ははるかに高いです。 – 9000

+0

@ senderle、9000が正しいです。その質問/回答は同じではありません。これは、リスト内の特定の索引を検索するのではなく、辞書内の特定のキーを検索するときに、辞書やリストに何かが含まれているかどうかを調べることです。この目的のために、リストは正しいインデックスに行くだけで、辞書はハッシュを計算する必要があります。ハッシングにはより多くの時間がかかります。 –

+0

@ジャスティン、申し訳ありません私は後者の記事を誤解したことを認識したときにそのコメントを削除しました。 – senderle