Класс строки Python, такой как StringBuilder в C #? - PullRequest
98 голосов
/ 10 марта 2010

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

Ответы [ 8 ]

86 голосов
/ 10 марта 2010

Нет однозначного соотношения. Для действительно хорошей статьи, пожалуйста, смотрите Эффективное объединение строк в Python :

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

26 голосов
/ 12 ноября 2012

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

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

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 проделали довольно большую работу по оптимизации объединения строк, и, как сказал Хоар: «преждевременная оптимизация - корень всего зла»: -)

17 голосов
/ 10 марта 2010

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

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

Опора на оптимизацию компилятора хрупка. Эталонам, указанным в принятом ответе, и цифрам, приведенным Антуаном-трансом, нельзя доверять. Эндрю Хэйр делает ошибку, включив в свои методы вызов 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
10 голосов
/ 02 ноября 2013

Используя метод 5 сверху (The 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
3 голосов
/ 10 марта 2010

вы можете попробовать StringIO или cStringIO

0 голосов
/ 21 января 2018

Не существует явного аналога - я думаю, что вы должны использовать конкатенацию строк (вероятно, оптимизированную, как сказано выше) или сторонний класс (я сомневаюсь, что они намного более эффективны - списки в python имеют динамическую типизацию, поэтому нет быстро работающий char [] для буфера, как я предполагаю). Stringbuilder-подобные классы не являются преждевременной оптимизацией из-за врожденной возможности строк во многих языках (неизменяемость), которая допускает много оптимизаций (например, ссылки на один и тот же буфер для срезов / подстрок). Stringbuilder / stringbuffer / stringstream-подобные классы работают намного быстрее, чем конкатенация строк (производя много маленьких временных объектов, которые все еще требуют выделения и сборку мусора) и даже инструменты для форматирования строк в printf-подобном, не требующие интерпретации издержек шаблона форматирования, которые довольно затратны много вызовов формата.

0 голосов
/ 31 декабря 2015

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

resultString = ""

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

См. Ответ Антуана-транса для результатов производительности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...