18

複雑な物理シミュレーション アルゴリズムを使用して、Python と C で科学プログラムを作成しています。アルゴリズムを実装した後、パフォーマンスを改善するために可能な最適化がたくさんあることがわかりました。一般的なものは、値の事前計算、計算のサイクル外化、単純なマトリックス アルゴリズムのより複雑なアルゴリズムへの置き換えなどです。しかし、問題が発生します。最適化されていないアルゴリズムははるかに遅くなりますが、そのロジックと理論との関係はより明確で読みやすいように見えます。また、最適化されたアルゴリズムを拡張および変更することは困難です。

問題は、パフォーマンスを向上させながら読みやすさを維持するには、どのような手法を使用する必要があるかということです。現在、高速で明確なブランチの両方を維持し、それらを並行して開発しようとしていますが、より良い方法があるでしょうか?

4

4 に答える 4

15

一般的な意見と同じように(私はPythonにあまり詳しくありません): 「リファレンス実装」の遅い部分を「最適化された」部分と簡単に交換できることを確認することをお勧めします(たとえば、戦略のようなものを使用します)パターン)。

これにより、より高度なアルゴリズムの結果を相互検証でき(結果を台無しにしないようにするため)、シミュレーションアルゴリズムの全体的な構造を明確に保つことができます(関心の分離)。最適化されたアルゴリズムを個別のソースファイル/フォルダー/パッケージに配置し、必要に応じて詳細に個別に文書化できます。

これとは別に、通常の罠を回避するようにしてください。時期尚早の最適化を行わないでください(たとえば、プロファイラーを使用して、実際に価値があるかどうかを確認してください)。また、車輪の再発明を行わないでください(利用可能なライブラリを探してください)。

于 2011-09-04T17:52:23.803 に答える
3

パフォーマンスを得るためには、読みやすさをあきらめなければならないと考えるのが一般的です。

必ずしもそうとは限りません。

あなたはそれが何をするのに多くの時間を費やしているのか、そしてその理由を正確に知る必要がありますか?

注意してください、私はあなたが測定をする必要があるとは言いませんでした。

これが私の言いたいことの例です。

無駄な動きを避けるためにいくつかの簡単な変更を行うことができる可能性は非常に高いですが、プログラム自体が修正するものを指示するまで何も修正しないでください。

于 2011-09-04T22:22:47.723 に答える
3

あなたの質問は、自分自身をプロと呼びたいプログラマーによって書かれた、単純であれ複雑であれ、ほとんどすべてのコードで発生する非常に良い質問です。

私は、私のコードに新しく来た読者が、私が最初に持っていたのと同じように、問題に対してほとんど同じ大雑把な見方と同じ単純な (おそらく力ずくの) アプローチを持っていることを思い出し、心に留めるようにしています。そして、問題の理解が深まり、解決への道筋が明確になったら、その理解を反映したコメントを書くようにしています。私は時々成功し、それらのコメントは読者を助け、特に 6 週間後にコードに戻ったときに役立ちます。とにかくたくさんのコメントを書くのが私のスタイルですが、そうしないと (なぜなら、突然の洞察に興奮するからです。それが実行されるのを見たいのです。私の脳は揚げられます)。

単純な方法と、より洗練された最適化された方法の 2 つの並列コード ストリームを維持できれば素晴らしいと思います。しかし、私はそれで成功したことはありません。

要するに、明確で、完全で、簡潔で、正確で、最新のコメントを書くことができれば、それが私にできる最善のことです。

すでに知っているもう 1 つのこと: 最適化は、通常、1 つのソース行に大量のコードを押し込むことを意味するものではありません。おそらく、引数が別の関数であり、引数がさらに別の関数である別の関数を引数として呼び出すことによってです。関数の値を一時的に保存することを避けるためにこれを行う人がいることを私は知っています。しかし、コードを高速化することはほとんど (通常は何も) なく、従うのは面倒です。あなたにニュースはありません、私は知っています。

于 2011-09-04T17:56:18.030 に答える
1
def whatYouShouldDo(servings, integration_method=oven):
    """
        Make chicken soup
    """
    # Comments:
    # They are important. With some syntax highlighting, the comments are
    # the first thing a new programmer will look for. Therefore, they should
    # motivate your algorithm, outline it, and break it up into stages.
    # You can MAKE IT FEEL AS IF YOU ARE READING TEXT, interspersing code
    # amongst the text.
    #
    # Algorithm overview:
    # To make chicken soup, we will acquire chicken broth and some noodles.
    # Preprocessing ingredients is done to optimize cooking time. Then we 
    # will output in SOUP format via stdout.
    #
    # BEGIN ALGORITHM
    #
    # Preprocessing:
    # 1. Thaw chicken broth.
    broth = chickenstore.deserialize()

    # 2. Mix with noodles
    if not noodles in cache:
        with begin_transaction(locals=poulty) as t:
            cache[noodles] = t.buy(noodles)  # get from local store
    noodles = cache[noodles]

    # 3. Perform 4th-order Runge-Kutta numerical integration
    import kitchensink import *  # FIXME: poor form, better to from kitchensink import pan at beginning
    result = boilerplate.RK4(broth `semidirect_product` noodles)

    # 4. Serve hot
    log.debug('attempting to serve')
    return result
    log.debug('server successful')

http://en.wikipedia.org/wiki/Literate_programming#Exampleも参照してください。

また、これはhttp://en.wikipedia.org/wiki/Aspect-directional_programmingが支援しようとしているものだと聞いたことがありますが、実際には調べていません。(これは、「最適化、デバッグ、およびその他のがらくたを、作成している関数の外に置く」という手の込んだ言い方のようです。)

于 2011-09-04T22:35:24.313 に答える