2012-11-26 24 views
1

首先感謝您的關注。我的問題是如何減少我的代碼的執行時間。Python性能分析(文件關閉)

這裏是相關的代碼。下面的代碼在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秒)。 call_prism例程被調用10次。但number_of_strings通常是數千,所以,我的程序需要花費很多時間才能完成。

讓我知道你是否需要更多信息。順便說一下,我也嘗試了子進程。謝謝。

+1

您應該使用子進程,無論這是否是用進程調用所有其他方式的替代方法。但是如果你必須使用系統進程,我認爲你沒有太多的辦法可以做。它們是昂貴的。 – jdi

+5

如果不是棱鏡而是調用一些簡單的命令,比如'echo','p.close()'還會佔用這麼多時間?棱鏡過程很可能需要一些很長的終止清理操作。順便說一句,如果棱鏡調用不互相依賴,那麼可以通過在並行線程中運行多個進程(例如,在每個內核的線程上)來嚴格減少執行時間。 – 9000

回答

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