8

遺伝的プログラミングタイプのアプリケーションを作成して、Pythonを学ぶのはとても楽しいです。

このサイトでは、Torsten Marek、Paul Hankin、AlexMartelliから素晴らしいアドバイスがありました。

プログラムには4つの主な機能があります。

  • 式ツリーを(ランダムに)生成します。
  • 木の適性を評価する
  • 交雑種
  • 変異する

生成、交雑、変異のすべてが「適応度を評価する」と呼びます。これは最も忙しい機能であり、速度的には主要なボトルネックです。

遺伝的アルゴリズムの性質と同様に、それは巨大な解空間を検索する必要があるので、速いほど良いです。これらの各機能を高速化したいと思います。フィットネス評価者から始めましょう。私の質問は、これを行うための最良の方法は何ですか。私はcython、ctypes、および「リンクと埋め込み」を調査してきました。それらはすべて私にとって新しいものであり、現時点では私をはるかに超えていますが、1つ、そして最終的にはすべてを学ぶことを楽しみにしています。

「適応度関数」は、式ツリーの値をターゲット式の値と比較する必要があります。したがって、接尾辞の順序でツリーを読み取る接尾辞エバリュエーターで構成されます。私はすべてのコードをPythonで持っています。

cython、ctypes、またはリンクと埋め込みなど、今学習して使用する必要があるアドバイスが必要です。

ありがとうございました。

4

4 に答える 4

14

今のところ、他の人の答えは無視してください。最初に使用する方法を学ぶ必要があるのは、プロファイラーです。Pythonにはprofile/cProfileが付属しています。結果を読み、実際のボトルネックがどこにあるかを分析する方法を学ぶ必要があります。最適化の目標は3つあります。各呼び出しに費やす時間を減らし、行われる呼び出しの数を減らし、メモリ使用量を減らしてディスクのスラッシングを減らします。

最初の目標は比較的簡単です。プロファイラーは最も時間のかかる関数を表示し、その関数に直接移動して最適化することができます。

2番目と3番目の目標は、アルゴリズムを変更して多くの呼び出しを行う必要性を減らす必要があることを意味するため、より困難です。呼び出しの数が多い関数を見つけて、それらを呼び出す必要性を減らす方法を見つけてください。組み込みのコレクションを利用して、非常によく最適化されています。

多くの数と配列の処理を行っている場合は、パンダ、Numpy / Scipy、gmpyサードパーティモジュールを確認する必要があります。これらは、配列/表形式データを処理するために最適化されたCライブラリです。

あなたが試したいもう一つのことはPyPyです。PyPyはJITを再コンパイルし、CPythonよりもはるかに高度な最適化を行うことができ、Pythonコードを変更しなくても機能します。CPythonをターゲットとする適切に最適化されたコードは、PyPyをターゲットとする適切に最適化されたコードとはかなり異なって見える可能性があります。

次に試すのはCythonです。CythonはPythonとは少し異なる言語です。実際、Cythonは、型付きのPythonのような構文を持つCとして最もよく記述されています。

他の方法では最適化できない非常にタイトなループにあるコードの部分については、C拡張機能として書き直すことをお勧めします。Pythonは、Cで拡張するための非常に優れたサポートを備えています。PyPyでは、PyPyを拡張する最良の方法はcffiを使用することです。

于 2010-04-15T18:47:53.553 に答える
3

Cythonは、アルゴリズムをCythonで直接記述するか、Cで記述してCythonを使用してPythonにバインドすることにより、最も迅速に作業を完了できます。

私のアドバイス:Cythonを学びましょう。

于 2010-04-15T16:42:46.853 に答える
0

メモ化をサポートするように、フィットネス機能を働かせてください。これにより、以前の呼び出しと重複するすべての呼び出しが、クイックdictルックアップに置き換えられます。

于 2010-04-15T23:57:28.823 に答える
0

もう1つの優れたオプションは、CまたはC++を簡単にラップできるboost::pythonです。

ただし、これらの可能性のうち、Pythonコードが既に記述されているため、cythonを最初に試すことをお勧めします。おそらく、スピードアップのためにコードを書き直す必要はないでしょう。

于 2010-04-15T16:36:22.647 に答える