Najlepszym sposobem dołączania ciąg do zmiennej łańcuchowej jest użycie +
lub +=
. Jest tak, ponieważ jest czytelny i szybki. Są również tak szybkie, który wybierzesz jest kwestią gustu, ten drugi jest najczęstszy. Oto czasy z timeit
modułem:
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
Jednak ci, którzy zalecają posiadanie list i dołączanie do nich, a następnie dołączanie do nich, robią to, ponieważ przypuszczenie dodania łańcucha do listy jest prawdopodobnie bardzo szybkie w porównaniu z przedłużeniem łańcucha. W niektórych przypadkach może to być prawda. Tutaj, na przykład, milion dołącza jednoznakowy ciąg, najpierw do ciągu, a następnie do listy:
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
OK, okazuje się, że nawet jeśli wynikowy ciąg ma milion znaków, dołączanie było jeszcze szybsze.
Teraz spróbujmy dodać łańcuch o długości tysiąca znaków sto tysięcy razy:
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
Końcowy ciąg ma zatem długość około 100 MB. To było dość powolne, dołączanie do listy było znacznie szybsze. Że ten czas nie obejmuje finału a.join()
. Jak długo to zajmie?
a.join(a):
0.43739795684814453
Ups. Okazuje się, że nawet w tym przypadku dołączanie / łączenie przebiega wolniej.
Skąd więc ta rekomendacja? Python 2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
Cóż, dołączanie / łączenie jest tam marginalnie szybsze, jeśli używasz bardzo długich ciągów (którymi zwykle nie jesteś, jaki miałbyś ciąg, który ma 100 MB pamięci?)
Ale prawdziwym klinicerem jest Python 2.3. Gdzie nawet nie pokażę ci czasu, ponieważ jest tak wolny, że jeszcze się nie skończył. Te testy nagle trwają minuty . Z wyjątkiem append / join, który jest tak samo szybki jak w późniejszych Pythonach.
Tak. Łączenie strun było bardzo powolne w Pythonie w epoce kamienia łupanego. Ale w wersji 2.4 już go nie ma (a przynajmniej Python 2.4.7), więc zalecenie użycia append / join stało się nieaktualne w 2008 roku, kiedy Python 2.3 przestał być aktualizowany i powinieneś przestać go używać. :-)
(Aktualizacja: Okazuje się, gdy przeprowadziłem testowanie ostrożniej niż przy użyciu +
i +=
jest szybsze dla dwóch łańcuchów w Pythonie 2.3. Zalecenia dotyczące używania ''.join()
muszą być nieporozumieniem)
Jest to jednak CPython. Inne wdrożenia mogą mieć inne obawy. I to tylko kolejny powód, dla którego przedwczesna optymalizacja jest źródłem wszelkiego zła. Nie używaj techniki, która powinna być „szybsza”, chyba że najpierw ją zmierzysz.
Dlatego „najlepszą” wersją do łączenia łańcuchów jest użycie + lub + = . A jeśli okaże się to dla ciebie powolne, co jest dość mało prawdopodobne, zrób coś innego.
Dlaczego więc używam dużo append / join w moim kodzie? Ponieważ czasami jest to wyraźniejsze. Zwłaszcza gdy wszystko, co powinieneś połączyć, powinno być oddzielone spacjami, przecinkami lub znakami nowej linii.