Python字符串类就像C#中的StringBuilder一样?
Python中是否有一些字符串类,如C#中的StringBuilder?
icn asked 2019-08-11T02:55:21Z
8个解决方案
85 votes
没有一对一的关联。 有关非常好的文章,请参阅Python中的Efficient String Concatenation:
在Python中构建长字符串 编程语言有时可以 导致代码运行速度非常慢。 在 这篇文章我调查了 各种计算性能 字符串连接方法。
Andrew Hare answered 2019-08-11T02:55:41Z
25 votes
我使用了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人员在优化字符串连接方面做得非常出色,正如霍尔所说:"过早优化是所有邪恶的根源":-)
Antoine-tran answered 2019-08-11T02:56:28Z
17 votes
Python有几个实现类似目的的东西:
从片段构建大型字符串的一种常见方法是增加字符串列表并在完成后加入它。 这是一个经常使用的Python习语。要构建包含格式化数据的字符串,您可以单独进行格式化。
对于字符级别的插入和删除,您将保留一个长度为一个字符串的列表。 (要从字符串中进行此操作,您可以拨打(c)StringIO.StringIO.您也可以使用UserString.MutableString。
(c)StringIO.StringIO对于以其他方式获取文件的内容非常有用,但对于一般的字符串构建则更少。
Mike Graham answered 2019-08-11T02:57:22Z
11 votes
依赖于编译器优化是脆弱的。 在接受的答案中链接的基准和Antoine-tran给出的数字是不可信的。 Andrew Hare错误地在他的方法中包含了对join的调用。 这会平均减慢所有方法的速度,但会掩盖构造字符串时的真正惩罚。
使用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
GrantJ answered 2019-08-11T02:57:55Z
10 votes
使用上面的方法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
Thomas Watson answered 2019-08-11T02:58:30Z
3 votes
你可以尝试StringIO或cStringIO
ghostdog74 answered 2019-08-11T02:58:54Z
-1 votes
没有明确的类比 - 我认为你应该使用字符串连接(可能是前面说过的优化)或第三方类(我怀疑它们更有效率 - python中的列表是动态类型所以没有快速工作 char []为缓冲区,我假设)。类似Stringbuilder的类不是过早优化,因为许多语言中的字符串的固有特性(不变性) - 允许许多优化(例如,为片/子串引用相同的缓冲区)。Stringbuilder / stringbuffer / stringstream-like类比连接字符串(产生许多仍需要分配和垃圾收集的小型临时对象)甚至字符串格式化类似printf的工具的工作速度快得多,而不需要解释非常消耗的格式化模式开销。 很多格式调用。
Mastermind answered 2019-08-11T02:59:22Z
-3 votes
如果您在这里寻找Python中的快速字符串连接方法,那么您不需要特殊的StringBuilder类。 简单的连接也可以在没有C#中的性能损失的情况下工作。
resultString = ""
resultString += "Append 1"
resultString += "Append 2"
请参阅Antoine-tran对性能结果的回答
Justas answered 2019-08-11T02:59:55Z