Есть ли в Python какой-нибудь строковый класс, как StringBuilder
в C #?
Есть ли в Python какой-нибудь строковый класс, как StringBuilder
в C #?
Ответы:
Однозначной корреляции нет. По-настоящему хорошую статью см. В разделе Эффективная конкатенация строк в Python :
Построение длинных строк на языке программирования Python может иногда приводить к очень медленному выполнению кода. В этой статье я исследую вычислительную производительность различных методов конкатенации строк.
Я использовал код Оливера Кроу (ссылка предоставлена Эндрю Хейром) и немного адаптировал его для адаптации Python 2.7.3. (с использованием пакета timeit). Я работал на своем персональном компьютере, Lenovo T61, 6 ГБ ОЗУ, Debian GNU / Linux 6.0.6 (сжатие).
Вот результат для 10000 итераций:
method1: 0,0538418292999 секунд размер процесса 4800 кб method2: 0,22602891922 секунды размер процесса 4960 кб method3: 0,0605459213257 секунд размер процесса 4980 кб method4: 0,0544030666351 сек. размер процесса 5536 кб method5: 0,0551080703735 секунд размер процесса 5272 кб method6: 0,0542731285095 секунд размер процесса 5512 кб
и для 5 000 000 итераций (метод 2 был проигнорирован, потому что он работал слишком медленно, как всегда):
method1: 5,88603997231 сек размер процесса 37976 кб method3: 8.40748500824 секунды размер процесса 38024 кб method4: 7.96380496025 секунд размер процесса 321968 кб method5: 8.03666186333 секунд размер процесса 71720 кб method6: 6.68192911148 секунд размер процесса 38240 кб
Совершенно очевидно, что разработчики Python проделали отличную работу по оптимизации конкатенации строк, и, как сказал Хоар, «преждевременная оптимизация - это корень всех зол» :-)
Полагаться на оптимизацию компилятора хрупко. Контрольным показателям, указанным в принятом ответе, и цифрам, приведенным Антуаном-Траном, нельзя доверять. Эндрю Хэйр совершает ошибку, включая обращение к repr
своим методам. Это в равной степени замедляет работу всех методов, но скрывает реальный ущерб при построении строки.
Используйте join
. Это очень быстро и надежно.
$ 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
repr
вызов доминирует во время выполнения, но нет необходимости делать ошибку личной.
У Python есть несколько вещей, которые служат для аналогичных целей:
list(your_string)
. Вы также можете использовать UserString.MutableString
для этого.(c)StringIO.StringIO
полезен для вещей, которые в противном случае занимали бы файл, но в меньшей степени для общего построения строк.Используя метод 5, описанный выше (Псевдо-файл), мы можем получить очень хорошую производительность и гибкость.
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()
теперь использую это
sb = StringBuilder()
sb.Append("Hello\n")
sb.Append("World")
print sb
Нет явного аналога - я думаю, вы должны использовать конкатенации строк (вероятно, оптимизированные, как было сказано ранее) или сторонний класс (я сомневаюсь, что они намного эффективнее - списки в python динамически типизированы, поэтому нет быстрой работы char [] для буфера, как я предполагаю). Классы, подобные Stringbuilder, не являются преждевременной оптимизацией из-за врожденной особенности строк во многих языках (неизменяемость), что позволяет выполнять множество оптимизаций (например, ссылаться на один и тот же буфер для срезов / подстрок). Классы Stringbuilder / stringbuffer / stringstream работают намного быстрее, чем объединение строк (создание множества небольших временных объектов, которые по-прежнему нуждаются в выделении памяти и сборке мусора) и даже инструменты форматирования строк, подобные printf, не требующие интерпретации накладных расходов шаблона форматирования, что довольно затратно для много форматных звонков.
Если вы здесь ищете метод быстрой конкатенации строк в Python, вам не нужен специальный класс StringBuilder. Простая конкатенация работает без потери производительности, наблюдаемой в C #.
resultString = ""
resultString += "Append 1"
resultString += "Append 2"
См . Ответ Антуана-транна о результатах работы