0

CSV からデータ構造を読み込んでいます。結果として得られる構造は、アイテム オブジェクトで構成される複数のコレクション クラスであり、それぞれが他のコレクションの子または親を指す 1 つまたは 2 つの属性を持ちます。

たいしたデータではありません。CSV は 800KB です。現在、CSV からデータ構造を読み込むには約3.5 秒かかります。最初はO(n^2)、完全に実行されるコンテインメント ルックアップによって破壊されていたコードがいくつかn^2ありましたが、インデックスを少し追加して、それを大幅に削減しました。

今でも私の弱点はコンテインメント ルックアップですが、直線的です。プログラムの中で最も時間のかかるコンポーネントが、次のようなコードの繰り返し実行である場合、イライラします。

def add_thing(thing):
    if thing not in things:
        things.append(thing)

私は何かが欠けているかもしれません (そうであることを願っています!) が、これらをスピードアップするためにできることはあまりないようです。thingsコレクションに同じthingものを複数回含めたくありません。そのためには、すでに存在するすべてのアイテムをチェックする必要があります。おそらくlist、私のためにこれを行うことができるより速いものがありますか? C ベースの、だまされないlist?

とにかく、結果のデータ構造をピクルして、load. 確かに、何が unpickle になるかはわかりませんが、データ構造自体は既に pickle に配置されているため、unpickle は生の I/O に近いものでなければならないと考えています。このデータ構造に2.4 秒pickle.loadかかることを知って驚きました。私の CSV スロップよりもわずか 30% 高速です。cPickle は0.4 秒で同じ仕事をしますが、私はこれを可能な限りリンゴからリンゴへと維持しようとしています。しかし、私の思考の流れを見て、その弱点を批判していただければ幸いです。

では、演習から何を収集すればよいのでしょうか?

  • のパフォーマンスpickle.loadと私の CSV 読み込みコードは互いに何の関係もないので、それらを比較するべきではありませんか?
  • このようなことには時間がかかりますか?
  • コンテインメント ルックアップをさらに最適化できますか?
  • 私はそれをすべて間違っていますか?

(注: プロファイリングには cProfile を使用しています)

4

0 に答える 0