Генераторы и производительность списков в Python
В настоящее время я изучал генераторы и составление списков, и возился с профилировщиком, чтобы увидеть, как прирост производительности наткнулся на этот cProfile, представляющий собой сумму простых чисел в большом диапазоне с использованием обоих.
Я вижу, что в генераторе: 1 genexpr как совокупное время короче, чем в аналоге списка, но вторая строка - то, что сбивает меня с толку. Выполняет ли вызов, который, я думаю, является проверкой числа, прост, но тогда не должен быть другой: 1 модуль в понимании списка?
Я что-то упустил в профиле?
In [8]: cProfile.run('sum((number for number in xrange(9999999) if number % 2 == 0))')
5000004 function calls in 1.111 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
5000001 0.760 0.000 0.760 0.000 <string>:1(<genexpr>)
1 0.000 0.000 1.111 1.111 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.351 0.351 1.111 1.111 {sum}
In [9]: cProfile.run('sum([number for number in xrange(9999999) if number % 2 == 0])')
3 function calls in 1.123 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 1.075 1.075 1.123 1.123 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.048 0.048 0.048 0.048 {sum}