2

データ モデルを整理するためにいくつかの属性を持つ Python オブジェクトを使用していますが、キー ベースの辞書を使用するよりも効率が悪いのではないかと考えています。私のモデルは MP3 タグ データを格納し、次のようになります。

class Mp3Model:
    def __init__(self, path, filename):
        self.path = path
        self.filename = filename
        self.artist = ''
        self.title = ''
        self.album = ''
        self.tracknumber = ''
        self.genre = ''
        self.date = ''

モデルは次のように使用されます。

mp3s = []
for file in files:
    if os.path.splitext(file)[1] == '.mp3':
        # Append a new Mp3Model to the mp3s list for each file found
        mp3s.append(Mp3Model(os.path.join(self.dir, file), file))

キーベースの辞書、または単純なリストを使用すると、パフォーマンスが大幅に向上しますか? mps[] オブジェクト リストの長さは、特定のディレクトリで見つかったファイルの数によって大きく異なります。大量のファイルを含むディレクトリをスキャンすると、プログラムの速度が遅くなることがあります (まだスレッド化を実装していません)。 .

4

5 に答える 5

5

オブジェクトに対して宣言しない限り__slots__、オブジェクトの属性は基本となるオブジェクトに格納されるため、オブジェクトdictを使用するdictよりもわずかに高速です。ただし、コードの残りの部分と比較すると、違いはごくわずかです。

データ構造の選択は、他のさまざまな要因に依存する必要があります。

  • 結果を保存する必要がありますか?
  • どのようにデータにアクセスしていますか? シリアルアクセスかランダムアクセスか?
  • どのキーでデータを検索しますか?
  • タスクを並列化することを計画している場合、同時書き込みを処理できますか? ロックのオーバーヘッドはどうなりますか?
  • ...

ユースケースに合わせて最適化すると、はるかに高い収益が得られます。

于 2012-08-16T15:23:33.293 に答える
2

辞書を使用すると、クラスを使用するよりも効率的になります。クラス、属性アクセスなどのすべてのオーバーヘッドを処理することを回避します。言うまでもなく、キーを介してディクショナリ内の項目にアクセスすることは、Python で最も効率的で最適化されたコードの 1 つです。

ただし、いくつかの注意事項があります。

  1. 確実なのは、テストすることによってのみ知ることができます。
  2. 最適化が必要であるとわかっていない限り、最適化しないでください。
于 2012-08-16T15:19:33.903 に答える
0

コードの特定の部分が遅い部分であると結論付ける前に、プログラムのプロファイルを作成します。それはおそらくあなたの最も内側のループですが、その仮定をテストしてください。ただそれに飛びつくのではありません。

CPUにバインドされた負荷については、Pypyを試してください。

I / Oバウンドのロードの場合は、キャッシュするか、何らかの方法で多数の小さなファイルを少数の大きなファイルに集約してみてください。オープンは、シーケンシャルデータのビットを読み取る場合に比べて遅くなる傾向があります。

HTH

于 2012-08-16T21:23:36.020 に答える
0

これは単なる推測ですが、ボトルネックはおそらくリストの作成ではなく、OS からのファイルの読み取りにあると思います。

そうは言っても、すべてのファイル名を含むリストを作成し、ファイル名を含むオブジェクトのリストを作成する場合とパフォーマンスを比較するだけで簡単にテストできます。

于 2012-08-16T15:17:09.037 に答える
0

別の方法が良いかどうかはわかりません。これらは次のように実行できます。

from collections import namedtuple

Mp3Model = namedtuple("Mp3Model", "path filename artist title")

シンプルなMp3Modelクラスを作成できます。

于 2012-08-17T14:22:17.953 に答える