Этот ответ и его комментарии дают некоторое представление о внутренней работе CPython str.join()
:
- Если аргумент еще не является
list
илиtuple
, создается новыйlist
с тем же содержимым. - Аргумент повторяется один раз, чтобы суммировать длины строк, которые он содержит.
- Память выделяется для новой строки.
- Наконец, аргумент повторяется во второй раз, и строки копируются в память для новой строки.
Мне это кажется сомнительным. Во-первых, зачем отбрасывать все типы последовательностей, кроме двух? Разве не будет намного быстрее просто повторять любую последовательность дважды вместо ее копирования? И зачем делать list
, особенно если вы не можете знать длину итерации, из которой вы ее делаете? Вам не нужен произвольный доступ, просто повторная итерация, а использование list
означает, что вам, возможно, придется перераспределять и копировать несколько раз во время его создания. Не лучше ли использовать связанный список или deque
?
Может ли кто-нибудь дать некоторое представление об этих дизайнерских решениях?
list
) или если они выделяются индивидуально. В обоих случаях элементы внутри не клонируются. То есть схема распределенияlist
фактически действует как SLAB. - person user2864740   schedule 12.04.2015itertools.tee
. Обратите внимание на комментарий: В общем случае, если один итератор использует большую часть или все данные до запуска другого итератора, быстрее использоватьlist()
вместоtee()
. - person jonrsharpe   schedule 12.04.2015memcpy
. В итоге вы делаете это только log(n) раз. - person Mark Ransom   schedule 13.04.2015