Как найти сложность встроенной функции в python

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

Итак, я хочу найти позицию подстроки в строке. Итак, в python существует метод поиска, который делает именно то, что необходимо.

string.find(s, sub [, start [, end]])

Возвращает самый низкий индекс в s, где подстрока sub обнаруживается так, что sub полностью содержится в с [начать: конец]. Возврат -1 при ошибке. Значения по умолчанию для начала и конца и интерпретация отрицательных значений такая же, как для срезов.

Удивительно, но проблема в том, что поиск большой подстроки в большой строке может выполняться от O(n*m) до O(n) (это огромная сделка) в зависимости от алгоритма. Документация не дает информации о временной сложности или информации о базовом алгоритме.

Я вижу несколько способов решения этой проблемы:

  • перейдите в исходный код и попытайтесь его понять.

Оба звука звучат не очень просто (я надеюсь, что есть более простой способ). Итак, как я могу найти сложность встроенной функции?

Ответ 1

Вы говорите: "Идите в исходный код и попытайтесь это понять", но это может быть проще, чем вы думаете. Когда вы перейдете к фактическому коду реализации, в Objects/stringlib/fastsearch.h вы найдете:

/* fast search/count implementation, based on a mix between boyer-
   moore and horspool, with a few more bells and whistles on the top.
   for some more background, see: http://effbot.org/zone/stringlib.htm */

Ссылка указанная там, хорошо обсуждает алгоритм и его сложность.