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

Par*_*ker 3 python printing string performance profiling

因此,根据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"
Run Code Online (Sandbox Code Playgroud)

要么

print '''Some word
Another line
something else'''
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Joh*_*ooy 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
Run Code Online (Sandbox Code Playgroud)


Kat*_*iel 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'
Run Code Online (Sandbox Code Playgroud)

  • @jimbob,连接并不总是二次 - 请参阅http://stackoverflow.com/questions/4128494 (3认同)
  • 顺便说一下,这个连接问题并不是特定于Python,而是适用于许多语言.此外,这是一个非常受欢迎的面试问题. (2认同)
  • 值得注意的是,连接的实际操作比少量字符串的任何替代方法快得多.另外,`join`几乎完全是除了这里的问题,因为问题是关于插值,其中`format`方法更快,而`join`是无用的. (2认同)