像C#中的StringBuilder的Pythonstring类?

在Python中有像StringBuilder一样的C#中的一些string类吗?

没有一对一的相关性。 对于一篇非常好的文章,请看Python中的Efficient String Concatenation :

用Python编程语言构build长string有时会导致运行代码非常慢。 在本文中,我将研究各种string连接方法的计算性能。

我已经使用了Oliver Crow的代码(由Andrew Hare给出的链接),并修改了一下Python 2.7.3。 (通过使用timeit软件包)。 我跑在我的个人电脑上,联想T61,6GB内存,Debian GNU / Linux 6.0.6(squeeze)。

这是10000次迭代的结果:

方法1:0.0538418292999秒
进程大小4800 kb
方法2:0.22602891922秒
进程大小4960 kb
 method3:0.0605459213257秒
进程大小4980 kb
方法4:0.0544030666351秒
进程大小5536 kb
方法5:0.0551080703735秒
进程大小5272 kb
方法6:0.0542731285095秒
进程大小5512 kb

和500万次迭代(方法2被忽略,因为它运行得太慢,像永远):

方法1:5.88603997231秒
进程大小37976 kb
方法3:8.40748500824秒
处理大小38024 kb
方法4:7.96380496025秒
进程大小321968 kb
方法5:8.03666186333秒
处理大小71720 kb
方法6:6.68192911148秒
进程大小38240 kb

很明显,Python家伙在优化string连接方面做得相当不错,正如Hoare所说:“过早优化是所有恶意的根源”:-)

Python有几个实现类似目的的东西:

  • 从零件中构build大型string的一种常见方法是,在完成后,生成一个string列表并join。 这是一个经常使用的Python成语。
    • 要使用格式化来构build包含数据的string,可以单独进行格式设置。
  • 对于在字符级别插入和删除,您将保留一个长度为一个string的列表。 (为了从一个string中得到这个,你可以调用list(your_string)也可以使用UserString.MutableString来实现。
  • (c)StringIO.StringIO对于那些可能需要文件的东西是有用的,但是对于一般的string构build来说不那么重要。

使用上面的方法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 

你可以试试StringIO或者cStringIO

依靠编译器优化是脆弱的。 被接受的答案和Antoine-tran给出的数字相关的基准是不可信的。 安德鲁·海尔(Andrew Hare)犯了一个错误,就是在他的方法中包含一个叫做repr 所有的方法同样缓慢,但掩盖了构buildstring的真正的惩罚。

使用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中的快速string连接方法,那么你不需要一个特殊的StringBuilder类。 简单的连接工作同样没有C#中的性能损失。

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

请参阅Antoine-tran对绩效结果的回答