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
нет явного аналога - я думаю, что вы должны использовать конкатенации строк(вероятно, оптимизированные, как было сказано ранее) или сторонний класс(я сомневаюсь, что они намного эффективнее-списки в python являются динамическими, поэтому нет быстро работающего char[] для буфера, как я предполагаю). Stringbuilder-подобные классы не являются преждевременной оптимизацией из - за врожденной особенности строк во многих языках(неизменяемость) - что позволяет проводить множество оптимизаций(например, ссылаться на один и тот же буфер для ломтики / подстроки). Stringbuilder/stringbuffer / stringstream-подобные классы работают намного быстрее, чем конкатенация строк(создание многих небольших временных объектов, которые все еще нуждаются в выделении и сборке мусора) и даже форматирование строк printf-подобные инструменты, не нуждающиеся в интерпретации накладных расходов шаблона форматирования, которые довольно потребляют много вызовов формата.
Если вы здесь ищете быстрый метод конкатенации строк в Python, то вам не нужен специальный класс StringBuilder. Простая конкатенация работает так же хорошо, как и без снижения производительности, наблюдаемого в C#.
resultString = "" resultString += "Append 1" resultString += "Append 2"посмотреть ответ Антуана-Трана по итогам работы
Comments