Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python性能评测(文件关闭)_Python_Performance_File_Profiling - Fatal编程技术网

Python性能评测(文件关闭)

Python性能评测(文件关闭),python,performance,file,profiling,Python,Performance,File,Profiling,首先感谢您的关注。我的问题是如何减少代码的执行时间 这是相关代码。下面的代码是在迭代中从main调用的 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.cl

首先感谢您的关注。我的问题是如何减少代码的执行时间

这是相关代码。下面的代码是在迭代中从main调用的

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秒)。调用prism例程10次。但是字符串的数量通常是以千为单位的,因此,我的程序需要很多时间才能完成


如果你需要更多信息,请告诉我。顺便说一下,我也尝试过使用子流程。谢谢。

谢谢你对我问题的反馈。根据其他人提供的评论,我编写了代码的并行版本,代码的性能确实得到了提高。下面是并行版本的片段。欢迎您的反馈(如果有)

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

不管如何,您都应该使用subprocess,因为它替代了流程调用的所有其他方式。但我认为如果你必须使用一个系统流程,你就没有什么可以做的了。它们很昂贵。如果您不调用prism,而是调用一些琐碎的命令,例如
echo
,那么
p.close()
还会占用这么多时间吗?prism进程可能只是在终止时执行一些长时间的清理操作。顺便说一句,如果prism调用彼此不依赖,您可能会通过在并行线程中运行多个进程(例如,在每个核心的线程上)来严重缩短执行时间。