наивные реализации алгоритма Строка поиска в Python 2.7: https://gist.github.com/heyhuyen/4341692
В середине реализации алгоритма поиска строки Бойер-Мура, я решил поиграть с моим оригинальным алгоритмом наивного поиска. Он реализован как метод экземпляра, который берет строку для поиска. Объект имеет атрибут «шаблон», который соответствует шаблону.
1) Вот исходная версия метода поиска с использованием двойного цикла for. Делает звонки в диапазоне и Len
def search(self, string):
for i in range(len(string)):
for j in range(len(self.pattern)):
if string[i+j] != self.pattern[j]:
break
elif j == len(self.pattern) - 1:
return i
return -1
2) Вот вторая версия, с использованием двойного While-цикл вместо этого. Чуть быстрее, не делая звонки в диапазоне
def search(self, string):
i = 0
while i < len(string):
j = 0
while j < len(self.pattern) and self.pattern[j] == string[i+j]:
j += 1
if j == len(self.pattern):
return i
i += 1
return -1
3) Вот оригинал, замена диапазон с xrange. Быстрее, чем оба предыдущих.
def search(self, string):
for i in xrange(len(string)):
for j in xrange(len(self.pattern)):
if string[i+j] != self.pattern[j]:
break
elif j == len(self.pattern) - 1:
return i
return -1
4) Сохранение значений в локальных переменных = выигрыш! С циклом double while это самый быстрый.
def search(self, string):
len_pat = len(self.pattern)
len_str = len(string)
i = 0
while i < len_str:
j = 0
while j < len_pat and self.pattern[j] == string[i+j]:
j += 1
if j == len_pat:
return i
i += 1
return -1