Итак, для тех, кто хотел бы узнать краткое содержание этого обсуждения. Окончательные максимальные оценки для подсчета выражения генератора длиной 50 миллионов с использованием:
len(list(gen))
,
len([_ for _ in gen])
,
sum(1 for _ in gen),
ilen(gen)
(из more_itertool ),
reduce(lambda c, i: c + 1, gen, 0)
,
, отсортированный по производительности выполнения (включая потребление памяти), удивит вас:
`` `
1: test_list.py:8: 0,492 КиБ
gen = (i for i in data*1000); t0 = monotonic(); len(list(gen))
('list, sec', 1.9684218849870376)
2: test_list_compr.py:8: 0,867 КиБ
gen = (i for i in data*1000); t0 = monotonic(); len([i for i in gen])
('list_compr, sec', 2.5885991149989422)
3: test_sum.py:8: 0,859 КиБ
gen = (i for i in data*1000); t0 = monotonic(); sum(1 for i in gen); t1 = monotonic()
(«сумма, сек», 3.441088170016883)
4: more_itertools / more.py: 413: 1,266 КиБ
d = deque(enumerate(iterable, 1), maxlen=1)
test_ilen.py:10: 0.875 KiB
gen = (i for i in data*1000); t0 = monotonic(); ilen(gen)
('ilen, sec', 9.812256851990242)
5: test_reduce.py:8: 0,859 КиБ
gen = (i for i in data*1000); t0 = monotonic(); reduce(lambda counter, i: counter + 1, gen, 0)
(«уменьшить, сек», 13.436614598002052)
`` `
Итак, len(list(gen))
является наиболее частым и менее потребляемым объемом памяти