Самое простое улучшение: прекратите использовать re
и измените if re.search(pattern, strg):
на if oldstr in strg:
; re
здесь ничего вам не покупает (это дороже, чем простой поиск по фиксированной строке).
В качестве альтернативы (и гораздо более сложно), если вы знаете кодировку файла, вы можете воспользоваться от использования модуля mmap
(в частности, с методом find
), чтобы избежать необходимости загружать весь файл в память и декодировать его, когда строка с умеренной вероятностью не появится на входе; просто предварительно кодируйте строку поиска и ищите необработанные двоичные данные. Примечание: это не будет работать для некоторых кодировок, где чтение необработанных байтов без выравнивания может привести к ложному положительному результату, но это будет прекрасно работать для самосинхронизирующихся кодировок (например, UTF-8) или однобайтовых кодировок (например, ASCII, latin- 1).
Наконец, при переписывании файла избегайте попадания его в память, а затем перезаписи исходного файла; помимо создания вашей программы d ie (или медленно), если размер файла превышает физическую ОЗУ, это означает, что если программа умирает после того, как начинает перезаписывать файл, вы теряете данные навсегда. Модуль tempfile
можно использовать для создания временного файла в том же dir
, что и исходный файл, вы можете читать построчно и заменять, как go, записывая во временный файл, пока вы не закончите. Затем просто выполните переименование atomi c из временного файла в исходное имя файла, чтобы заменить исходный файл как одну операцию (убедитесь, что это либо новые данные, либо старые данные, а не какая-то промежуточная версия данных).
Распараллеливание может принести вам что-то, но если вы работаете с вращающимся диском, конфликт ввода-вывода скорее повредит, чем поможет. Единственный раз, когда я видел надежные улучшения, это сетевые файловые системы с большой пропускной способностью, но достаточной задержкой, чтобы гарантировать параллельное выполнение операций ввода-вывода.