Проблема:
Замена нескольких строковых шаблонов в большом текстовом файле занимает много времени. (Python)
Сценарий:
У меня есть большой текстовый файл без особой структуры. Но он содержит несколько шаблонов. Например, адреса электронной почты и номера телефонов.
В текстовом файле содержится более 100 различных таких шаблонов, а размер файла - 10 МБ (размер может увеличиваться). Текстовый файл может содержать или не содержать все 100 шаблонов.
В настоящее время я заменяю совпадения с помощью re.sub()
, и подход к выполнению замены выглядит, как показано ниже.
readfile = gzip.open(path, 'r') # read the zipped file
lines = readfile.readlines() # load the lines
for line in lines:
if len(line.strip()) != 0: # strip the empty lines
linestr += line
for pattern in patterns: # patterns contains all regex and respective replaces
regex = pattern[0]
replace = pattern[1]
compiled_regex = compile_regex(regex)
linestr = re.sub(compiled_regex, replace, linestr)
Этот подход требует много времени для больших файлов. Есть ли лучший способ его оптимизировать?
Я подумываю заменить +=
на .join()
, но не уверен, насколько это поможет.
2 ответа
Вы можете использовать lineprofiler, чтобы определить, какие строки в вашем коде занимают больше всего времени
pip install line_profiler
kernprof -l run.py
Еще одна вещь, я думаю, вы создаете слишком большую строку в памяти, возможно, вы можете использовать генераторы
Вы можете получить немного лучшие результаты, если:
large_list = []
with gzip.open(path, 'r') as fp:
for line in fp.readlines():
if line.strip():
large_list.append(line)
merged_lines = ''.join(large_list)
for regex, replace in patterns:
compiled_regex = compile_regex(regex)
merged_lines = re.sub(compiled_regex, replace, merged_lines)
Однако дальнейшая оптимизация может быть достигнута, зная, какой тип обработки вы применяете. Фактически, последняя строка будет занимать всю мощность процессора (и выделение памяти). Если регулярные выражения можно применять к каждой строке, вы можете добиться отличных результатов, используя пакет многопроцессорной обработки. Многопоточность вам ничего не даст из-за GIL (https://wiki.python.org/moin/ GlobalInterpreterLock)
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.