1

まずはご清聴ありがとうございました。私の質問は、コードの実行時間を短縮する方法です。

関連するコードは次のとおりです。以下のコードは、メインから繰り返し呼び出されます。

def call_prism(prism_input_file,random_length):
   prism_output_file = "path.txt"
   cmd = "prism %s -simpath %d %s" % (prism_input_file,random_length,prism_output_file)
   p = os.popen(cmd)
   p.close()
   return prism_output_file


def main(prism_input_file, number_of_strings):
...
  for n in range(number_of_strings):
        prism_output_file = call_prism(prism_input_file,z[n])
        ...

  return

コードのプロファイルを作成するときに、「プロファイル統計ブラウザー」からの統計を使用しました。「ファイルを閉じる」システムコマンドに最大時間(14.546秒)かかりました。call_prismルーチンは10回呼び出されます。しかし、number_of_stringsは通常数千であるため、私のプログラムは完了するのに多くの時間がかかります。

さらに情報が必要な場合はお知らせください。ちなみに私もサブプロセスでやってみました。ありがとう。

4

1 に答える 1

0

私の質問に対するフィードバックをお寄せいただきありがとうございます。他の人が提供したコメントに基づいて、コードの並列バージョンを実行したところ、コードのパフォーマンスが実際に改善されました。これは、パラレル バージョンのスニペットです。フィードバックがあれば、大歓迎です。

def call_prism(prism_input_file,random_length):
    ...   
    cmd = "prism %s -simpath %d stdout" % (prism_input_file,random_length)
    args = shlex.split(cmd)
    p = subprocess.Popen(args,stdout=subprocess.PIPE)
    p.poll()
    prism_output_lines = p.stdout.readlines()
    ...
    return ...

def call_prism_star(prism_input_file_random_length):
   return call_prism(*prism_input_file_random_length)

def main(prism_input_file, number_of_strings,number_of_threads):
   pool = Pool(processes=number_of_threads)
   for n in range(0,number_of_strings,number_of_threads):
   ...
      for i in range(number_of_threads):
          a_args.append(...)
      output = pool.map(call_prism_star,itertools.izip(itertools.repeat(prism_input_file),a_args))
   ...
    return
于 2012-11-30T15:03:45.260 に答える