Итак, прежде всего, давайте разберемся, почему это работает.
>>> string1 = "foo"
>>> string2 = "bar"
>>> string1.join(string2)
'bfooafoor'
Это операция ввода string1
между каждым пунктом (характер) string2
.
Так заменить пустую строку делает что-то вроде интересно, он считает разрыв между пустыми символами, как пустая строка, и, следовательно, делает по существу ту же самую задачу, за исключением дополнительного сепаратора в начале и конце:
>>> string2.replace('', string1)
'foobfooafoorfoo'
так нарезка из них дает тот же результат, как str.join()
:
>>> string2.replace('', string1)[len(string1):-len(string1)]
'bfooafoor'
Очевидно, что это решение гораздо, гораздо менее читабельным, чем str.join()
, и поэтому я всегда рекомендую против него. str.join()
также был разработан, чтобы быть эффективным на всех платформах. Замена пустой строки может быть намного менее эффективной для некоторых версий Python (я не знаю, так ли это, но это возможно - так же, как повторное конкатенация достаточно быстро в CPython, но это не обязательно в другом месте.)
я даже не могу ничего найти в документации, что наводит на мысль, что это поведение заменив пустую строку должна функционировать таким образом, the docs for str.replace()
просто сказать:
возвращает копию строки со всеми вхождениями подстроки старым заменен новым. Если задан параметр необязательного аргумента, заменяются только первые совпадения.
Я не вижу причин, почему мы должны предполагать, что зазоры между ними буквами следует рассчитывать как возникновение пустой строки (возможно, вы могли бы поместиться бесконечные пустые строки в любом месте в строке), и как таковой, опираясь на это может быть плохой идеей.
Эта операция также довольно редка - чаще встречается последовательность строк для объединения - объединение отдельных символов строки - это не то, что я лично должен был делать часто.
Интересно, что это x.replace("", y)
кажется, особыми обсаженным в the Python source:
2347 /* Algorithms for different cases of string replacement */
2348
2349 /* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
2350 Py_LOCAL(PyStringObject *)
2351 replace_interleave(PyStringObject *self,
2352 const char *to_s, Py_ssize_t to_len,
2353 Py_ssize_t maxcount)
2354 {
...
Это вполне может быть это специальный кожух заставляет его хорошо выполнять.Опять же, как это не упоминается в документации, это деталь реализации, и если предположить, что она будет работать так же быстро (или вообще) в других версиях Python, это будет ошибкой.
Передача строки в 'join' кажется узким местом. Преобразование 'string2' в' list' сокращает время с '697' до' 148' нс. – Blender
Тот факт, что вы пропускаете очень частое использование 'x.join (y)', не учитывается? Например, как насчет '. '.Join ([' 1 ',' 2 ',' 3 '])'? – mmgp
Есть несколько проблем с этим, в первую очередь - удобочитаемость. Это ужасно для людей, чтобы читать. Во-вторых, производительность для вашего метода может сильно различаться в зависимости от используемой реализации Python (CPython - это не единственная вещь) и как указывает mmgp, используя 'join()' со строкой, поскольку первый аргумент на самом деле очень редок операция. –