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) . (И снова это не так быстро, как создание списка явно из строки.)

  • Оператор 'is' ведет себя неожиданно с не кэшированными целыми числами
  • Поиск исходного кода для встроенных функций Python?
  • Производительность функции Python
  • В чем разница между типом .__ getattribute__ и объектом .__ getattribute__?
  • область действия функции eval в python
  • Почему str.translate быстрее в Python 3.5 по сравнению с Python 3.4?
  • Python получает доступ к списку при сортировке
  • Почему функция Python len работает быстрее, чем метод __len__?
  • Python - лучший язык программирования в мире.