Самый эффективный способ печати строк в Python? - PullRequest
3 голосов
/ 09 ноября 2010

Таким образом, согласно советам по оптимизации на 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 ]

6 голосов
/ 09 ноября 2010

Конкатенация строк была улучшена для (довольно распространенного) случая, когда имеется только одна ссылка на строку.См. PyString_ConcatAndDel в stringobject.c

Таким образом, обычно конкатенация в цикле является линейной, поскольку существует только одна ссылка на строку

Вот простой эксперимент для демонстрацииповедение.Когда нет места для расширения строки, 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
5 голосов
/ 09 ноября 2010

Ваш вопрос на самом деле не о самом эффективном способе печати строк, а о форматировании их для вывода, для которого вы должны использовать format в любом случае, потому что это больше, чем простая конкатенация. Тем не менее, вот некоторые заметки о конкатенации.


Редактировать: переписано, чтобы включить некоторые детали

Печать не имеет значения. Важным моментом является то, что из-за того, как некоторые языки обрабатывают конкатенацию строк, объединение множества строк может иметь квадратичный порядок. (Очень наивное и простое) рассуждение состоит в том, что для объединения двух строк вам нужно пройтись по всем символам первой строки, а затем добавить все символы второй строки. Поэтому, если вы объединяете десять строк, сначала вы проходите первую и добавляете вторую, затем вы проходите первую + вторую и добавляете третью, затем вы проходите первую + вторую + третью и добавляете четвертую и т. Д.

Таким образом, наивная реализация конкатенации заставит вас выполнять гораздо больше работы, чем нужно. Действительно, в ранних версиях Python это было проблемой. Тем не менее, @gnibbler указал в комментариях, более поздние версии теперь, как правило, оптимизируют это, таким образом, полностью обсуждая этот вопрос.

Идиома 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 голосов
/ 09 ноября 2010

Для печати нет необходимости объединять:

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

Это работает так же (запятая в конце предотвращает \n):

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

Я думаю, что ответ НЕТ, не объединяйте только для печати, это замедлит работу. Но вы действительно не должны поверить мне на слово, просто напишите несколько тестов и профиль с timeit .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...