Czy w Pythonie jest jakaś klasa ciągów, taka jak StringBuilderw C #?
Czy w Pythonie jest jakaś klasa ciągów, taka jak StringBuilderw C #?
Odpowiedzi:
Nie ma korelacji jeden do jednego. Aby uzyskać naprawdę dobry artykuł, zobacz Efektywne konkatenowanie ciągów w Pythonie :
Budowanie długich ciągów w języku programowania Python może czasami skutkować bardzo powolnym działaniem kodu. W tym artykule badam wydajność obliczeniową różnych metod łączenia ciągów.
Użyłem kodu Olivera Crow'a (link podany przez Andrew Hare'a) i dostosowałem go trochę, aby dostosować Python 2.7.3. (przy użyciu pakietu timeit). Uruchomiłem na swoim komputerze osobistym Lenovo T61, 6 GB RAM, Debian GNU / Linux 6.0.6 (squeeze).
Oto wynik dla 10000 iteracji:
metoda1: 0,0538418292999 sek wielkość procesu 4800 kb metoda2: 0,22602891922 sek wielkość procesu 4960 kb metoda3: 0,0605459213257 sek wielkość procesu 4980 kb metoda4: 0,0544030666351 sek wielkość procesu 5536 kb metoda5: 0,0551080703735 sek wielkość procesu 5272 kb metoda6: 0,0542731285095 sek wielkość procesu 5512 kb
i dla 5 000 000 iteracji (metoda 2 została zignorowana, ponieważ działała zbyt wolno, jak zawsze):
metoda1: 5,88603997231 sek wielkość procesu 37976 kb metoda3: 8.40748500824 sek wielkość procesu 38024 kb metoda4: 7,96380496025 sek wielkość procesu 321968 kb metoda5: 8,03666186333 sek wielkość procesu 71720 kb metoda6: 6,68192911148 sek wielkość procesu 38240 kb
Jest całkiem oczywiste, że ludzie z Pythona wykonali kawał dobrej roboty, aby zoptymalizować konkatenację ciągów i jak powiedział Hoare: „przedwczesna optymalizacja jest źródłem wszelkiego zła” :-)
Poleganie na optymalizacji kompilatora jest delikatne. Nie należy ufać benchmarkom podanym w zaakceptowanej odpowiedzi i liczbom podanym przez Antoine-tran. Andrew Hare popełnia błąd, włączając wywołanie do reprswoich metod. To jednakowo spowalnia wszystkie metody, ale przesłania prawdziwą karę w tworzeniu łańcucha.
Użyj join. Jest bardzo szybki i solidniejszy.
$ ipython3
Python 3.5.1 (default, Mar 2 2016, 03:38:02)
IPython 4.1.2 -- An enhanced Interactive Python.
In [1]: values = [str(num) for num in range(int(1e3))]
In [2]: %%timeit
...: ''.join(values)
...:
100000 loops, best of 3: 7.37 µs per loop
In [3]: %%timeit
...: result = ''
...: for value in values:
...: result += value
...:
10000 loops, best of 3: 82.8 µs per loop
In [4]: import io
In [5]: %%timeit
...: writer = io.StringIO()
...: for value in values:
...: writer.write(value)
...: writer.getvalue()
...:
10000 loops, best of 3: 81.8 µs per loop
reprpołączenie dominuje w czasie wykonywania, ale nie ma potrzeby, aby ten błąd był osobisty.
Python ma kilka rzeczy, które spełniają podobne cele:
list(your_string). Możesz także użyć UserString.MutableStringdo tego.(c)StringIO.StringIO jest przydatny do rzeczy, które w innym przypadku zajęłyby plik, ale mniej do ogólnego budowania ciągów.Używając metody 5 z góry (The Pseudo File) możemy uzyskać bardzo dobrą wydajność i elastyczność
from cStringIO import StringIO
class StringBuilder:
_file_str = None
def __init__(self):
self._file_str = StringIO()
def Append(self, str):
self._file_str.write(str)
def __str__(self):
return self._file_str.getvalue()
teraz go używam
sb = StringBuilder()
sb.Append("Hello\n")
sb.Append("World")
print sb
Nie ma wyraźnego odpowiednika - myślę, że oczekuje się od Ciebie użycia konkatenacji ciągów (prawdopodobnie zoptymalizowanych, jak wspomniano wcześniej) lub klasy innej firmy (wątpię, czy są o wiele bardziej wydajne - listy w Pythonie są typowane dynamicznie, więc nie działają szybko char [] dla bufora, jak zakładam). Klasy typu Stringbuilder nie są przedwczesną optymalizacją ze względu na wrodzoną cechę ciągów w wielu językach (niezmienność) - która pozwala na wiele optymalizacji (na przykład odwoływanie się do tego samego bufora dla wycinków / podciągów). Klasy typu stringbuilder / stringbuffer / stringstream działają znacznie szybciej niż łączenie ciągów (tworząc wiele małych tymczasowych obiektów, które nadal wymagają alokacji i czyszczenia pamięci), a nawet formatowania ciągów narzędzi podobnych do printf, bez konieczności interpretowania narzutu formatowania wzorca, który jest dość pochłaniający wiele wywołań formatów.
Jeśli szukasz szybkiej metody konkatenacji ciągów znaków w Pythonie, nie potrzebujesz specjalnej klasy StringBuilder. Prosta konkatenacja działa równie dobrze bez obniżenia wydajności widocznego w C #.
resultString = ""
resultString += "Append 1"
resultString += "Append 2"
Zobacz odpowiedź Antoine-tran na wyniki wydajności