Эффективно искать много разных строк в большом файле - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь найти самый быстрый способ поиска строк в файле.Прежде всего, у меня нет только одной строки для поиска.У меня есть список 1900 строк, чтобы найти в файле, который составляет 150 МБ.Таким образом, в основном я открываю файл, повторяя цикл 1900 раз, чтобы найти все вхождения этой строки в этом файле.Вот некоторые атрибуты моего поиска.

A) Размер файла для поиска составляет 150 МБ - это текстовый файл.Б) Мне нужно найти все вхождения 1900 строк в файле.Значит, я зацикливаю 1900 раз весь файл для поиска всех вхождений.C) Это не простой поиск, я должен использовать регулярное выражение для поиска строки.D) В некоторых случаях мне нужна строка выше и строка ниже того места, где я нашел строку поиска.Поэтому мне нужно использовать file.readlines (), а не file.read (). E) В некоторых случаях я также должен заменить искомую строку новой строкой.

Сначала я пытаюсь найти лучший способ поискав файле.Мой код занимает слишком много времени.Я не уверен, что это лучший способ сделать это.Вот мой код.

#searchstrings is list of 1900 strings
file = open("mytextfile.txt", "r")
for line in file:
    for i in range(len(searchstrings)):
        if searchstrings[i] in line:
            print(line)
file.close()

Этот код выполняет свою работу, но он очень медленный.Также это не дает мне возможности выбрать строку выше или ниже, где находится строка поиска.

Другой код, который я использую для замены строки, как показано ниже.Этот код также очень медленный.Здесь я использую регулярное выражение.

file = open("mytextfile.txt", "r")
file_data = file.read()
#searchstrings is list of 1900 strings
#replacestrings is list of 1900 strings that needs to be replaced
for i in range(len(searchstrings)):
    src_str = re.compile(searchstrings[i], re.IGNORECASE)
    file_data = src_str.sub(replacestrings[i], file_data)
file.close()

Я знаю, что производительность кода также зависит от вычислительной мощности, но я просто хочу знать, как лучше всего написать этот код, который будет работать с оптимальной скоростью для данного hw.Также я хотел бы знать, как рассчитать время выполнения программы.

Спасибо заранее

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Мне нравятся команды Unix, они веселые, быстрые и эффективные.

import re, sys
map(sys.stdout.write,(string_x for string_x in sys.stdin if re.search(sys.argv[1],string_x)))
0 голосов
/ 22 сентября 2019

Несколько замечаний.

Для идиоматического Python обычно требуется

for string in searchstrings:
    ...

вместо

for i in range(len(searchstrings)):
    searchstrings[i]

и with open(filename) as f: ... вместо open()/close().Оператор with автоматически закроет файл.

Если вы хотите заменить любую из нескольких строк на регулярное выражение, вы можете сделать

re.sub('|'.join(YOUR_STRINGS), replacement, text)

, потому что | является символом регулярного выражения.для «или», вместо того, чтобы зацикливать их все по отдельности.

Для производительности я мог бы попробовать переключиться с CPython на PyPy .PyPy - это еще одна реализация того же языка, но часто гораздо более быстрая.

С другой стороны, если это действительно все, что должна делать ваша программа, вы можете использовать специальный инструмент для работы, такой как Ag илиRipGrep, который уже был оптимизирован для этой работы.Возможно через функцию subprocess.run(), если вы работаете в Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...