5

Pythonで作成したboggle-clone用のネットワークサーバーを作成しています。これは、ユーザーを受け入れ、ボードを解決し、プレーヤーの入力をスコアリングします。私が使用している辞書ファイルは1.8MB(ENABLE2K辞書)であり、いくつかのゲームソルバークラスで使用できるようにする必要があります。現在、各クラスがファイルを1行ずつ繰り返し、ハッシュテーブル(連想配列)を生成するようにしていますが、インスタンス化するソルバークラスが多いほど、より多くのメモリを消費します。

What I would like to do is import the dictionary file once and pass it to each solver instance as they need it. But what is the best way to do this? Should I import the dictionary in the global space, then access it in the solver class as globals()['dictionary']? Or should I import the dictionary then pass it as an argument to the class constructor? Is one of these better than the other? Is there a third option?

4

4 に答える 4

11

ファイルを読み取って辞書を作成するコードを含む dictionary.py モジュールを作成すると、このコードは最初にインポートされたときにのみ実行されます。さらにインポートすると、既存のモジュール インスタンスへの参照が返されます。そのため、クラスは次のことができます。

import dictionary

dictionary.words[whatever]

Dictionary.py の場所:

words = {}

# read file and add to 'words'
于 2008-10-01T17:30:41.083 に答える
1

この時点では基本的にシングルトンですが、グローバルに対する通常の議論が適用されます。pythonic シングルトン代替については、「borg」オブジェクトを検索してください。

それが本当に唯一の違いです。ディクショナリ オブジェクトが作成されると、明示的にディープ コピーを実行しない限り、新しい参照をバインドするだけです。各ソルバー インスタンスが変更用のプライベート コピーを必要としない限り、1 回だけ集中的に構築されることは理にかなっています。

于 2008-10-01T16:55:23.103 に答える
1

Adam、Python で次のように言うときのことを思い出してください。

a = read_dict_from_file()
b = a

...実際にはコピーし aていないため、より多くのメモリを使用してbいるため、同じオブジェクトへの別の参照を作成しているだけです。

したがって、基本的に、提案するソリューションはどれも、メモリ使用量の点ではるかに優れています。基本的には、辞書を一度読んでから、それを参照してください。グローバル変数で行うか、各インスタンスに渡すか、または他の何かに渡すかに関係なく、同じオブジェクトを参照し、複製することはありません。

どれが最も Pythonic ですか? それはワームの完全な缶詰ですが、私が個人的に行うことは次のとおりです。

def main(args):
  run_initialization_stuff()
  dictionary = read_dictionary_from_file()
  solvers = [ Solver(class=x, dictionary=dictionary) for x in len(number_of_solvers) ]

HTH。

于 2008-10-01T20:00:11.583 に答える
0

dict の内容によっては、'shelve' または 'anydbm' モジュールに興味があるかもしれません。それらは dict のようなインターフェイス ('anydbm' のキーとアイテムとしての文字列、'shelve' のキーとしての文字列とアイテムとしての任意の python オブジェクト) を提供しますが、データは実際には DBM ファイル (gdbm、ndbm、dbhash、プラットフォームで利用可能なものに応じて、bsddb を使用します。) 求めているように、クラス間で実際のデータベースを共有したい場合もありますが、テキストファイルの解析ステップとすべてを保持するステップを回避できます。 -メモリービット。

于 2008-10-01T19:38:26.860 に答える