在Python中打印字符串的最有效方法?

时间:2010-11-08 21:47:05

标签: python string printing profiling performance

所以根据http://wiki.python.org/moin/PythonSpeed/PerformanceTips的优化提示,加入字符串应该用

完成

out = "<html>%(head)s%(prologue)s%(query)s%(tail)s</html>" % locals()
  而不是 out = "<html>" + head + prologue + query + tail + "</html>" 我的问题是,如果我想打印,这是相同的,而不是存储价值?将连续的打印语句全部放在一行上会更快吗?就像使用

更好
print "Some word"
print "Another line"
print "something else"

print '''Some word
Another line
something else'''

提前致谢!

3 个答案:

答案 0 :(得分:6)

字符串连接已针对(相当常见)情况进行了改进,其中只有一个对字符串的引用。请参阅stringobject.c

中的PyString_ConcatAndDel

因此,循环中的连接通常是线性的,因为只有一个字符串

的引用

这是一个演示行为的简单实验。如果没有空间扩展字符串id()更改

>>> s = ""
>>> prev_id = None
>>> for i in range(1000):
...  s += "*"
...  if prev_id != id(s):
...   print id(s), len(s)
...   prev_id = id(s)
... 
3077352864 1
3077437728 2
3077434328 9
3077428384 17
3077379928 25
3077291808 33
3077712448 41
3077358800 49
3077394728 57
3077667680 65
3077515120 73
3077354176 81
3077576488 89
3077559200 97
3077414248 105
3077670336 113
3077612160 121
3077707040 129
3077526040 137
3077571472 145
3077694944 153
3077595936 161
3077661904 169
3077552608 177
3077715680 185
3077583776 193
3077244304 201
3077604560 209
3077510392 217
3077334304 225
144468768 233
144787416 245
144890104 389

答案 1 :(得分:5)

你的问题并不是关于打印字符串的最有效方法,而是关于将它们格式化为输出,在任何情况下都应该使用format,因为它不仅仅是简单的连接。但是,这里有一些关于连接的注释。


编辑:重写以包含一些细节

印刷无关紧要。重要的是,由于某些语言处理字符串连接的方式,连接大量字符串可能是二次序。 (非常幼稚和基本的)推理是连接两个字符串,你必须走下第一个字符串的所有字符,然后追加第二个字符串的所有字符。因此,如果你连接十个字符串,你首先走第一个并追加第二个,然后你走第一个+第二个并追加第三个,然后你走第一个+第二个+第三个并追加第四个,依此类推。

连接的简单实现将导致您做更多的工作而不是您需要的工作。实际上,在Python的早期版本中,这是一个问题。但是,@ gibbler在评论中已经指出,后来的版本现在通常会对此进行优化,从而完全扼杀了这一点。

加入字符串的Python习语是"".join(...)。这完全绕过了任何可能的问题,无论如何都是标准的习惯用语。如果您希望能够通过追加来构造字符串,请查看StringIO

>>> from io import StringIO
>>> foo = StringIO()
>>> for letter in map(chr, range(128)):
...     foo.write(letter)
...
>>> foo.seek(0)
0
>>> foo.read()
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\
x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABC
DEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f'

答案 2 :(得分:2)

对于打印,无需连接:

print "<html>", head, prologue, query, tail, "</html>"

这个工作方式相同(最后的逗号会阻止\n):

print "<html>",
print head,
...
print "</html>"

我认为答案是否定的,不仅仅是为了打印而连接,它会让事情变得更慢。但你真的不应该接受我的话,只需用timeit写一些测试和简介。

相关问题