Рассмотрите проблему извлечения алфавитов из огромной строки.Соединение строк. Понимание генератора или списка?
Один из способов сделать это
''.join([c for c in hugestring if c.isalpha()])
Механизм понятен: Список понимание формирует список символов. Метод join знает, сколько символов ему нужно объединить, обратившись к длине списка.
Другой способ сделать это
''.join(c for c in hugestring if c.isalpha())
Здесь результаты генератора постижение в генераторе. Метод соединения не знает, сколько символов он собирается присоединиться, потому что генератор не обладает атрибутом len. Таким образом, этот способ соединения должен быть медленнее, чем метод понимания списка.
Но тестирование на питоне показывает, что оно не медленнее. Почему это так? Может ли кто-нибудь объяснить, как соединение работает на генераторе.
Чтобы был ясен:
sum(j for j in range(100))
не нужно иметь какие-либо знания 100, поскольку он может следить за нарастающий итог. Он может получить доступ к следующему элементу, используя следующий метод для генератора, а затем добавить к суммарной сумме. Однако, поскольку строки неизменяемы, объединение строк кумулятивно создало бы новую строку на каждой итерации. Так что это займет много времени.
Значит, разница в скорости OP-уведомления должна быть чисто косвенной, не так ли? –
@ Ev.Kounis: Вопросник сказал, что две версии были схожи по скорости («** не ** медленнее»), что имеет смысл, если они измеряют время, затраченное на «join», и время, затраченное на понимание списка вместе. Если вы измеряли только «join», версия выражения генератора была бы медленнее, поскольку она должна была сбрасывать весь генератор в список, прежде чем выполнять объединение строк. Это займет примерно столько же времени, сколько и построение понимания списка в другой версии. – Blckknght