Почему вызов grep с использованием subprocess.Popen () значительно быстрее, чем с использованием subprocess.check_output () - PullRequest
0 голосов
/ 30 марта 2019

Мне нужно извлечь строки записей в csv-подобном файле, и я использую grep, чтобы сделать это внутри скрипта Python.Я заметил, что когда я вызываю grep с помощью subprocess.check_output, для завершения требуется около 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 голосов
/ 30 марта 2019

Вы обнаружите, что вызов 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.

...