3

私の現在の仕事では、CPUを集中的に使用するデータ処理を行う長時間実行(数時間から数日と考えてください)スクリプトを作成しています。プログラムフローは非常に単純です。メインループに進み、メインループを完了し、出力を保存して終了します。私のプログラムの基本構造は次のようになりがちです。

<import statements>
<constant declarations>

<misc function declarations>

def main():
   for blah in blahs():
      <lots of local variables>
      <lots of tightly coupled computation>

      for something in somethings():
          <lots more local variables>
          <lots more computation>

   <etc., etc.>

   <save results>

if __name__ == "__main__":
    main()

これはすぐに管理できなくなるので、より管理しやすいものにリファクタリングしたいと思います。実行速度を犠牲にすることなく、これをより保守しやすくしたいと思います。

ただし、コードの各チャックは多数の変数に依存しているため、計算の一部を関数にリファクタリングすると、パラメーターリストがすぐに手に負えなくなります。この種のコードをPythonクラスに入れて、ローカル変数をクラス変数に変更する必要がありますか?プログラムをクラスに変換することは、概念的にはあまり意味がありません。クラスが再利用されることはなく、インスタンスごとに1つのインスタンスしか作成されないためです。

この種のプログラムのベストプラクティスの構造は何ですか?私はPythonを使用していますが、最新のオブジェクト指向言語機能を想定すると、質問は比較的言語に依存しません。

4

3 に答える 3

2

まず、プログラムが数時間/数日間実行される場合、すべてを巨大なメイン​​に配置する代わりにクラス/メソッドを使用するように切り替えるオーバーヘッドはほとんどありません。

さらに、リファクタリング(多くの変数を渡す必要がある場合でも)は、長期的には速度を向上させるのに役立ちます。適切に設計されたアプリケーションのプロファイリングは、遅い部分を特定してそこで最適化できるため、はるかに簡単です。計算用に高度に最適化された新しいライブラリが登場するかもしれません...適切に設計されたプログラムを使用すると、プラグを差し込んですぐにテストできます。または、計算のサブセットの速度を向上させるためにCモジュール拡張機能を作成することにした場合でも、適切に設計されたアプリケーションを使用すると、それも簡単になります。

<lots of tightly coupled computation>とを見ずに具体的なアドバイスをするのは難しい<lots more computation>です。しかし、私はすべてforのブロックを独自のメソッドにすることから始めて、そこから進みます。

于 2010-05-27T13:46:58.080 に答える
2

あまりきれいではありませんが、小さなプロジェクトではうまく機能します...

モジュールをシングルトンインスタンスであるかのように使用し始め、モジュールの複雑さまたは計算によってモジュールが正当化されると感じた場合にのみ、実際のクラスを作成できます。

その場合は、「モジュールのインポートから」ではなく「モジュールのインポート」を使用することをお勧めします。「もの」を再割り当てできると、よりクリーンになり、より適切に機能します。また、Googleのガイドラインで推奨されています。

于 2010-05-27T14:56:14.493 に答える
1

1つまたは複数のクラスを使用すると、コードを整理するのに役立ちます。フォームの単純さ(クラス属性やメソッドの使用など)は、アルゴリズムを確認するのに役立ち、パーツをより簡単に単体テストするのに役立つため、重要です。

IMO、これらの利点は、OOPの使用に伴う速度のわずかな低下をはるかに上回ります。

于 2010-05-27T13:35:08.710 に答える