Строковый класс Python, такой как StringBuilder в С#?

Есть ли какой-нибудь строковый класс в Python, например StringBuilder в С#?

Ответ 1

Не существует взаимно однозначной корреляции. Для действительно хорошей статьи см. Эффективное конкатенация строк в Python:

Создание длинных строк в Python язык программирования может иногда приводят к очень медленному запуску кода. В в этой статье я исследую вычислительная производительность различных методы конкатенации строк.

Ответ 2

Я использовал код Оливера Кроу (ссылка, данное Эндрю Харе) и немного адаптировал его для адаптации Python 2.7.3. (с помощью пакета timeit). Я бегал на своем персональном компьютере, Lenovo T61, RAM 6 ГБ, Debian GNU/Linux 6.0.6 (сжатие).

Вот результат для 10000 итераций:

method1:  0.0538418292999 secs
process size 4800 kb
method2:  0.22602891922 secs
process size 4960 kb
method3:  0.0605459213257 secs
process size 4980 kb
method4:  0.0544030666351 secs
process size 5536 kb
method5:  0.0551080703735 secs
process size 5272 kb
method6:  0.0542731285095 secs
process size 5512 kb

и для 5 000 000 итераций (метод 2 был проигнорирован, потому что он медленно запускался медленно, как и навсегда):

method1:  5.88603997231 secs
process size 37976 kb
method3:  8.40748500824 secs
process size 38024 kb
method4:  7.96380496025 secs
process size 321968 kb
method5:  8.03666186333 secs
process size 71720 kb
method6:  6.68192911148 secs
process size 38240 kb

Совершенно очевидно, что парни Python проделали большую работу по оптимизации конкатенации строк, и, как сказал Хоар: "преждевременная оптимизация - корень всего зла": -)

Ответ 3

У Python есть несколько вещей, которые выполняют аналогичные цели:

  • Один из распространенных способов построения больших строк из кусков состоит в том, чтобы вырастить список строк и присоединиться к нему, когда вы закончите. Это часто используемая идиома Python.
    • Чтобы создать строки, содержащие данные с форматированием, вы будете форматировать отдельно.
  • Для вставки и удаления на уровне символов вы сохраните список строк длиной один. (Чтобы сделать это из строки, вы должны вызвать list(your_string). Для этого также можно использовать UserString.MutableString.
  • (c)StringIO.StringIO полезен для вещей, которые в противном случае принимают файл, но в меньшей степени для общего построения строк.

Ответ 4

Используя метод 5 сверху (Pseudo File), мы можем получить очень хороший перформанс и гибкость.

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

Ответ 6

Использование оптимизаторов компилятора является хрупким. Оценки, связанные с принятым ответом и номерами, данными Антуан-троном, не заслуживают доверия. Эндрю Харе делает ошибку, включая вызов 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

Ответ 7

Если вы ищете быстрый метод конкатенации строк в Python, вам не нужен специальный класс StringBuilder. Простая конкатенация работает так же хорошо, как и на С#.

resultString = ""

resultString += "Append 1"
resultString += "Append 2"

См. ответ Антуан-трона для результатов работы