Почему этот метод поиска по словарю для обработки строки в слова медленнее, чем .split()?

#python

#python

Вопрос:

Когда я написал свою первую функцию для разделения строки на слова на основе списка символов-разделителей, я подумал, что я неаккуратен / ленив, поскольку это, по-видимому, повторило бы всю строку снова для каждого символа в списке разделителей, не говоря уже о том, чтобы объединить список обратно в строку:

 def splitText(text, list):
    for str in list:
        text = " ".join(text.split(str))
    arr = text.split(" ")
    cleaned = []
    for word in arr:
        if word != "":
            cleaned.append(word)
    return cleaned
  

Итак, я написал другую версию, используя поиск по словарю, поскольку он выполняет итерацию по строке за один раз, ожидая гораздо лучшей производительности, поскольку для каждого символа в строке будет выполняться один поиск O (1), а не множество разбиений и объединений, выполняемых в вышеупомянутой функции:

 def splitTextFast(text, dict):
    arr = []
    progressIndex = 0
    for i, char in enumerate(text):
        if char in dict:
            arr.append(text[progressIndex:i])
        progressIndex = i   1
    return arr
  

Но, к моему удивлению, splitTextFast был значительно медленнее. Почему? Или, какую ошибку я могу исправить, чтобы создать наиболее оптимальную версию этой функции? Я только сегодня начал использовать Python, так что, возможно, я упускаю что-то очевидное.

использование:

 splitCharsArr = [",", ".", ";", "'", " "]
splitCharsDict = {",": True, ".": True, ";": True, "'": True, " ": True }
mockData = "one. two;  three four.five'six   ;seven,eight,nine"
wordList1 = splitText(mockData, splitCharsArr)
wordList2 = splitTextFast(mockData, splitCharsDict)
  

Комментарии:

1. splitTextFast выполняется итерация по text символу за символом, а не слово за словом, как splitText .

2. @chepner но чтобы определить «слова» из строки, split() нужно перебирать символ за символом слишком глубоко, верно?

3. Итерация выполняется в оптимизированном коде C, а не в интерпретируемом коде Python.

4. И, вероятно, использует аппаратные инструкции для поиска байта.

5. Ваша логика для splitTextFast неверна и wordList2 выдает ['', '', '', '', '', '', '', '', '', '', '', '', '', ''] , в то время как wordlist1 выдает ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] . У вас проблема в этих строках if char in dict: arr.append(text[progressIndex:i]) progressIndex = i 1