Python中是否有类似StringBuilder
C#的字符串类?
没有一对一的关联.有关非常好的文章,请参阅Python中的Efficient String Concatenation:
在Python编程语言中构建长字符串有时会导致代码运行速度非常慢.在本文中,我研究了各种字符串连接方法的计算性能.
我使用了Oliver Crow的代码(Andrew Hare给出的链接)并对它进行了一些调整以适应Python 2.7.3.(通过使用timeit包).我使用个人电脑,联想T61,6GB RAM,Debian GNU/Linux 6.0.6(挤压).
以下是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人员在优化字符串连接方面做得非常出色,而Hoare说:"过早优化是所有邪恶的根源":-)
Python有几个实现类似目的的东西:
从片段构建大型字符串的一种常见方法是增加字符串列表并在完成后加入它.这是一个经常使用的Python习语.
要构建包含格式化数据的字符串,您可以单独进行格式化.
对于字符级别的插入和删除,您将保留一个长度为一个字符串的列表.(要从字符串中进行此操作,list(your_string)
您可以调用.您也可以使用UserString.MutableString
此字符串.
(c)StringIO.StringIO
对于原本会占用文件的东西很有用,但对于一般的字符串构建则不太常见.
依赖于编译器优化是脆弱的.在接受的答案中链接的基准和Antoine-tran给出的数字是不可信的.Andrew Hare错误地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
使用上面的方法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