为什么使用subprocess.Popen()调用grep比使用subprocess.check_output()显着更快

时间:2019-03-29 22:22:07

标签: python time grep subprocess

我需要在类似csv的文件中提取条目的行,并且我正在使用grep在python脚本中进行操作。我注意到当我使用subprocess.check_output调用grep时,大约需要5.28秒才能完成。但是当我使用subprocess.Popen时,只需要0.002秒。那似乎是巨大的差异,我想知道应该使用哪个。应该注意的是,我打算将每一行处理为一个字符串。

这是我的python脚本的一部分。

myenv = os.environ.copy()
myenv['LC_ALL'] = 'C'
file = data_path+'/'+files[12]
start = time.time()
match = 'chr3' + "[[:space:]]"
matched_reads = subprocess.Popen(['grep', match, file], stdout=subprocess.PIPE, env=myenv)
mathced_reads = str(matched_reads).splitlines()
end = time.time()
runtime = end-start
print("Popen Grep: ", runtime)

start = time.time()
match = 'chr3' + "[[:space:]]"
matched_reads = subprocess.check_output(['grep', match, file],env=myenv)
mathced_reads = str(matched_reads).splitlines()
end = time.time()
runtime = end-start
print("Checkoutput Grep: ", runtime)

1 个答案:

答案 0 :(得分:0)

您会发现调用Popen实际上并不会执行程序并返回输出,而是会构造一个引用所创建进程的对象。在您的情况下,您没有调用Popen.communicate来“对话”该流程并捕获其完整的输出。而check_output为您做所有的事情。您会发现communicate方法会花费很长时间,但实际上会返回所需的输出。

对于带有POpen的实际演示,请替换

matched_reads = subprocess.Popen(['grep', match, file], stdout=subprocess.PIPE, env=myenv)

使用

process = subprocess.Popen(['grep', match, file], stdout=subprocess.PIPE, env=myenv)
matched_reads, stderr = process.communicate()

应复制与check_output相同的行为,以使matched_reads包含grep产生的输出。