2011-10-26 33 views
2

私はy総コストに収まるx製品のすべての可能性を得るために、小さなモジュールをPythonで作成しました。モジュールはうまく動作しますが、遅くなります。 6つの製品を各製品の30回の反復まで計算するのに約6時間かかります。だから、私はFORTRANでスクリプトを書き直すことを考えていましたが、もっと速いスピードでミルクを吐くことができないかどうかを確認しました。残念なことに、私はFORTRANを初めて使っています。今ではほとんどのライブラリなどはありません。fortranのcombination_with_replacement関数ですか?

pythonのitertools.combinations_with_replacement(pool, r)と同じモジュール/機能がFORTRANにありますか、同じことを達成するモジュールはありますか?

答えて

2

Do not do that。あなたは、アルゴリズムの最適化を行う必要があるときにマイクロ最適化をしようとしています。これが私があなたにitertoolsに基づいてshould not use the exponential-time solutionと主張した理由ですが、better, recursive solutionです。

+0

私はretracileに同意します。交換の可能性のあるすべての組み合わせを真に調べる必要がない場合は、避ける価値があります。また、CPythonのcombine_with_replacentはC言語で書かれているため、Fortranでその部分を書き直すことでスピードを上げることはできません(それぞれの組み合わせに対して実行する処理の速度を上げることはできます)。 –

+0

確かに、あなたは正しいです。私をまっすぐにしてくれてありがとう。必要な反復回数を計算する方法を知っていますか?あなたの方法でも、私はまだ長い時間を取っています。数時間ではなく、分ですが、進捗バーにはまだふさわしいものです。 – AedonEtLIRA

+0

私はあなたの次のステップは、あなたが結果を使用しているものについて考え直して考えることだと思います。すべての可能性を持つ必要がなければ、さらに最適化の余地があるかもしれません。また、私が持っている実装例は、ジェネレータに変換することで改善することができます。 (これは簡単ではありませんが、読者のための練習として残しておきます)。 – retracile

0

FWIWのitertools documentationには、_と_置き換え()の純粋なPythonがあります。それは簡潔であり、Fortranに翻訳するのが難しいはずがありません。

def combinations_with_replacement(iterable, r): 
    # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC 
    pool = tuple(iterable) 
    n = len(pool) 
    if not n and r: 
     return 
    indices = [0] * r 
    yield tuple(pool[i] for i in indices) 
    while True: 
     for i in reversed(range(r)): 
      if indices[i] != n - 1: 
       break 
     else: 
      return 
     indices[i:] = [indices[i] + 1] * (r - i) 
     yield tuple(pool[i] for i in indices) 
+0

ありがとう、私はそれを見ていました。私はちょうど車輪を書き直さないようにしていた。 ;-P – AedonEtLIRA

関連する問題