像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对绩效结果的回答