And*_*are 92
没有一对一的关联.有关非常好的文章,请参阅Python中的Efficient String Concatenation:
在Python编程语言中构建长字符串有时会导致代码运行速度非常慢.在本文中,我研究了各种字符串连接方法的计算性能.
小智 27
我使用了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说:"过早优化是所有邪恶的根源":-)
Mik*_*ham 18
Python有几个实现类似目的的东西:
list(your_string)
您可以调用.您也可以使用UserString.MutableString
此字符串.(c)StringIO.StringIO
对于原本会占用文件的东西很有用,但对于一般的字符串构建则不太常见.Gra*_*ntJ 18
依赖于编译器优化是脆弱的.在接受的答案中链接的基准和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
Run Code Online (Sandbox Code Playgroud)
Tho*_*son 10
使用上面的方法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()
Run Code Online (Sandbox Code Playgroud)
现在用它
sb = StringBuilder()
sb.Append("Hello\n")
sb.Append("World")
print sb
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
101757 次 |
最近记录: |