У меня есть генератор, который генерирует конечную последовательность. Чтобы определить длину этой последовательности, я попробовал эти два подхода:
seq_len = sum([1 for _ in euler14_seq(sv)]) # list comp
и
seq_len = sum(1 for _ in euler14_seq(sv)) # generator expression
sv
- постоянное начальное значение для последовательности.
Я ожидал, что понимание списка будет медленнее, а выражение генератора - быстрее, но оказалось, что все наоборот.
Я предполагаю, что первый будет намного более интенсивным с точки зрения памяти, поскольку он сначала создает полный список в памяти - отчасти я думал, что он будет медленнее.
Мой вопрос: можно ли обобщить это наблюдение? И это связано с тем, что во втором операторе задействованы два генератора, а не в первом?
Я просмотрел эти Какой самый короткий способ подсчитать количество элементов в генераторе / итераторе?, Длина вывода генератора и Есть ли какой-либо встроенный способ получить длину итерируемого в python? и видел некоторые другие подходы к измерению длины последовательности, но я специально любопытно сравнить составление списка с выражением генератора.
PS: Это возникло, когда я решил решить проект Эйлера № 14 на основе вопроса, заданного вчера на SO. .
(Кстати, каково общее мнение об использовании '_'
в местах, где значения переменных не нужны).
Это было сделано с помощью Python 2.7.2 (32-разрядная версия) под 64-разрядной версией Windows 7.
len(list(euler14_seq(sv)))
? Кроме того, если вы тестируете производительность таким образом, вы должны сказать, на какой платформе вы тестируете. В частности, версия Python и ОС и, возможно, информация об оборудовании. - person Peter Graham   schedule 06.07.2012__call__
накладные расходы (которые могут быть медленными в Python), а listcomp - нет, но это внутреннее чувство, что я не могу резервировать ссылками ... - person Jon Clements♦   schedule 06.07.2012len()
в обоих выражениях, но ожидал, что результат не изменится. Кроме того, применяяlist()
к генератору, разве вы не устраняете в основном сравнение генератора и списка? - person Levon   schedule 06.07.2012len
работает очень быстро и O (1), тогда какsum
, вероятно, намного медленнее и O (n) - person Peter Graham   schedule 06.07.2012