Python: понимание итераторов и `join ()` лучше

Функция join() принимает итеративный параметр. Однако мне было интересно, почему:

 text = 'asdfqwer' 

Эта:

 ''.join([c for c in text]) 

Значительно быстрее, чем:

 ''.join(c for c in text) 

То же самое происходит с длинными строками (например, text * 10000000 ).

Наблюдая за объемом памяти обоих исполнений с длинными строками, я думаю, что они оба создают один и только один список символов в памяти, а затем присоединяют их к строке. Поэтому я предполагаю, что разница заключается только в том, как join() создает этот список из генератора и как интерпретатор Python делает то же самое, когда видит [c for c in text] . Но, опять же, я просто догадываюсь, поэтому я хотел бы, чтобы кто-то подтвердил / отклонил мои догадки.

One Solution collect form web for “Python: понимание итераторов и `join ()` лучше”

Метод join дважды считывает его вход; один раз, чтобы определить, сколько памяти выделяется для результирующего строкового объекта, затем снова выполнить фактическое соединение. Передача списка выполняется быстрее, чем передача объекта-генератора, что ему нужно сделать копию, чтобы она могла перебирать ее дважды.

Понимание списка – это не просто объект-генератор, завернутый в список, поэтому построение списка извне происходит быстрее, чем join создающее его из объекта-генератора. Объекты генератора оптимизированы для эффективности памяти, а не скорости.

Конечно, строка уже является итерируемым объектом, поэтому вы можете просто написать ''.join(text) . (И снова это не так быстро, как создание списка явно из строки.)

  • Почему поиск в dict всегда лучше, чем просмотр списка?
  • Почему из __future__ import * возникает ошибка?
  • Внутренние для кортежей python
  • Как работает декоратор @property?
  • Почему наивная конкатенация строк становится квадратичной над определенной длиной?
  • Почему __code__ для функции (Python) изменен
  • Почему bytearray не является Sequence в Python 2?
  • Переменное назначение быстрее, чем один вкладыш
  • Почему массивы Python медленны?
  • Почему список спрашивает о __len__?
  • Почему в Python требуется в три раза больше памяти?
  •  
    Interesting Posts for Van-Lav

    В Cython возможны внутренние типизации C ++?

    pylint жалуется на wxPython «Слишком много публичных методов»,

    Установите представление matplotlib как нормальное к плоскости xy в Python

    Печать вывода Python с помощью кода PHP

    может WSGI получить полный URL, а не просто: environ ? .. если так .. Mod_Rewrite альтернатива?

    Как создать сервер сокетов Python, который прослушивает дескриптор файла?

    BLAS / LAPACK не установлен: как его установить?

    Как найти самый короткий путь зависимости между двумя словами в Python?

    Двунаправленный поток между интерфейсом D3.js и Python Backend? / Интерактивные графики на веб-сайте

    Python – Ловушка всех сигналов

    Список доступных тестов с py.test

    Как бы вы реализовали базовый цикл событий?

    Разрешение Django для каждого действия

    замаскируйте массив 2D numpy на основе значений в одном столбце

    Что является хорошим эквивалентом python subprocess.check_call, который возвращает содержимое stdout?

    Python - лучший язык программирования в мире.