powiedzmy masz ten kod do budowania ciąg z trzech ciągów:
x = 'foo'
x += 'bar' # 'foobar'
x += 'baz' # 'foobarbaz'
W tym przypadku, Python musi najpierw przydzielić i tworzyć 'foobar'
zanim będzie mogła przeznaczyć i tworzyć 'foobarbaz'
.
Tak dla każdego wywoływanego +=
cała zawartość ciągu i wszystkiego, co się do niego dodaje, należy skopiować do zupełnie nowego bufora pamięci. Innymi słowy, jeśli masz ciągi, które mają być połączone, musisz przydzielić około N
tymczasowych ciągów, a pierwszy podciąg zostanie skopiowany ~ N razy. Ostatni podciąg zostaje skopiowany tylko jeden raz, ale średnio każdy podciąg zostaje skopiowany kilka razy.
Z .join
, Python może odgrywać pewną liczbę trików, ponieważ pośrednie ciągi nie muszą być tworzone. CPython ustala, ile pamięci potrzebuje z góry, a następnie przydziela bufor o prawidłowym rozmiarze. Na koniec kopiuje każdy element do nowego bufora, co oznacza, że każdy element jest kopiowany tylko raz.
Istnieją inne realne podejście, które mogłyby doprowadzić do lepszej wydajności dla +=
w niektórych przypadkach. Na przykład. jeśli wewnętrzna reprezentacja ciągów jest w rzeczywistości rope
lub jeśli środowisko wykonawcze jest wystarczająco inteligentne, aby w jakiś sposób dowiedzieć się, że tymczasowe ciągi nie są użyteczne dla programu i optymalizować je.
Jednak CPython pewno robi nie robić te optymalizacje wiarygodny (choć może na few corner cases) i ponieważ jest najczęstszym realizacja w użyciu, wiele najlepsze praktyki oparte są na tym, co działa dobrze dla CPython. Posiadanie znormalizowanego zestawu norm ułatwia także innym działaniom optymalizację ich wysiłków optymalizacyjnych.
Powiązane. http://stackoverflow.com/questions/34008010/is-this-time-complexity-actually-on2 –
'+ =' zachowuje się inaczej dla łańcucha, liczb całkowitych. możliwe jest, że Python potrzebuje więcej czasu na określenie typu danych, na których '+ =' działa, tj. jego dodanie, jeśli są one liczbami całkowitymi podczas konkatowania, jeśli są łańcuchami. W operacji '.info()' oczekuje tylko elementów łańcuchowych - co sprawia, że Python nie przejmuje się typem danych, z którymi ma do czynienia. – stuartnox
@ cricket_007 połączony z wielkim postem zapewniającym lepszy wgląd. Jednak zaakceptowałem odpowiedź MGILSONA. –