Python string class как StringBuilder в C#?



есть ли какой-то строковый класс в Python, например StringBuilder в C#?

502   8  

8 ответов:

нет никакой индивидуальной корреляции. Для действительно хорошей статьи, пожалуйста, смотрите эффективная конкатенация строк в Python:

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

я использовал код Оливера Кроу (ссылка, предоставленная Эндрю Хэром) и немного адаптировал его для адаптации Python 2.7.3. (с помощью пакета timeit). Я работал на своем персональном компьютере, Lenovo T61, 6GB RAM, 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 ребята сделали довольно отличная работа по оптимизации конкатенации строк, и как сказал Хоэр: "преждевременная оптимизация-это корень всех зол": -)

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

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

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

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

полагаться на оптимизацию компилятора, является хрупким. Контрольным показателям, связанным с принятым ответом и цифрами, приведенными Антуаном-Траном, нельзя доверять. Андрей Заяц делает ошибку, включив вызов 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

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

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

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

resultString = ""

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

посмотреть ответ Антуана-Трана по итогам работы

Comments

    Ничего не найдено.