#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