当前位置:  开发笔记 > 编程语言 > 正文

Python字符串类就像C#中的StringBuilder一样?

如何解决《Python字符串类就像C#中的StringBuilder一样?》经验,为你挑选了5个好方法。

Python中是否有类似StringBuilderC#的字符串类?



1> Andrew Hare..:

没有一对一的关联.有关非常好的文章,请参阅Python中的Efficient String Concatenation:

在Python编程语言中构建长字符串有时会导致代码运行速度非常慢.在本文中,我研究了各种字符串连接方法的计算性能.


请注意,本文是基于Python 2.2编写的.在现代版本的Python中,测试可能会有所不同(CPython通常会成功优化连接,但您不希望在重要代码中依赖于此),并且使用列表推导的生成器表达式值得考虑.
最好在文章中引入一些亮点,至少在几个实现中(以避免链接腐烂问题).
你的引言完全没有回答这个问题.请在答案中包含相关部分,以符合新指南.
方法1:根据@ Antoine-tran下面的测试,resultString + = appendString是最快的

2> 小智..:

我使用了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说:"过早优化是所有邪恶的根源":-)


避免脆弱的,依赖于解释器的优化并不是一种过早的优化.如果您想要移植到PyPy或冒险进行[许多微妙的失败案例之一](http://stackoverflow.com/questions/24040198/cpython-string-addition-optimisation-failure-case)进行优化,事情是正确的.
显然,Hoare不接受:http://hans.gerwitz.com/2004/08/12/premature-optimization-is-the-root-of-all-evil.html

3> Mike Graham..:

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

从片段构建大型字符串的一种常见方法是增加字符串列表并在完成后加入它.这是一个经常使用的Python习语.

要构建包含格式化数据的字符串,您可以单独进行格式化.

对于字符级别的插入和删除,您将保留一个长度为一个字符串的列表.(要从字符串中进行此操作,list(your_string)您可以调用.您也可以使用UserString.MutableString此字符串.

(c)StringIO.StringIO 对于原本会占用文件的东西很有用,但对于一般的字符串构建则不太常见.



4> GrantJ..:

依赖于编译器优化是脆弱的.在接受的答案中链接的基准和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


@AlexReinking对不起,没有任何个人含义。我不确定是什么使您认为它是私人的。但是,如果使用的是他们的名字,我只会使用这些名字来指代用户的答案(与用户名匹配,不确定是否有更好的方法)。

5> Thomas Watso..:

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

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有