繁体   English   中英

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

[英]Most efficient way to print strings in Python?

因此,根据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'''

提前致谢!

字符串连接已经针对(相当常见的)情况进行了改进,其中只有一个对字符串的引用。 请参阅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

你的问题并不是关于打印字符串的最有效方法,而是关于将它们格式化为输出,在任何情况下都应该使用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'

对于打印,不需要连接:

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

这工作原理相同(最后的逗号阻止\\n ):

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

我认为答案是否定的,不仅仅为了打印而连接,它会让事情变得更慢。 但你真的不应该把我的话,只是写了一些测试,并与轮廓timeit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM