У меня возникли проблемы с оптимизацией этой части кода. Он работает, но кажется ненужным медленным. Функция ищет после searchString
в файле, начинающемся со строки line_nr
, и возвращает номер строки для первого совпадения.
import linecache
def searchStr(fileName, searchString, line_nr = 1, linesInFile):
# The above string is the input to this function
# line_nr is needed to search after certain lines.
# linesInFile is total number of lines in the file.
while line_nr < linesInFile + 1:
line = linecache.getline(fileName, line_nr)
has_match = line.find(searchString)
if has_match >= 0:
return line_nr
break
line_nr += 1
Я пробовал кое-что из этих строк, но так и не удалось реализовать ввод "начать с определенного номера строки".
Изменить: вариант использования. Я обрабатываю файлы анализа, содержащие текст и числа, которые разбиты на разные разделы с заголовками. Заголовки в line_nr используются для разделения фрагментов данных для дальнейшей обработки.
Пример вызова:
startOnLine = searchStr(имя файла, 'Заголовок 1', 1, 10000000): endOnLine = searchStr(имя файла, 'Заголовок 2', startOnLine, 10000000):
str.find()
- person yedpodtrzitko   schedule 13.11.2013str.find
иre.search
с помощьюtimeit
, я получаю 0,7773511409759521 дляre.search
и 0,15282893180847168 дляstr.find
(Python 2.7.3 в Ubuntu). - person bruno desthuilliers   schedule 13.11.2013str.find
будет намного быстрее, но если у вас сотни - тысячи строк, регулярное выражение будет быстрее (+ с использованиемre.compile
...) - person yedpodtrzitko   schedule 13.11.2013re
автоматически компилирует шаблоны и хранит (довольно большой) кэш последних использованных скомпилированных шаблонов. Поскольку шаблон является динамическим и известен только во время выполнения, я не вижу смысла вручную вызывать здесьre.compile
. - person bruno desthuilliers   schedule 13.11.2013re.compile
: см. это суть: gist.github.com/yedpodtrzitko/7451361 - person yedpodtrzitko   schedule 13.11.2013