У меня возникли некоторые проблемы, пытаясь понять генераторы.
Различается ли время выполнения этих функций при выполнении одной и той же задачи?
def slow_sum(size):
x= 0
for i in range(size):
for j in range(size):
x += i + j
return x
def fast_sum(size):
return sum( [ (i+j) for j in range(size) for i in range(size)] )
size = 2000
slow_val = slow_sum(size)
fast_val = fast_sum(size)
assert slow_val == fast_val, "Values are not equal"
При профилировании обеих функций на моем компьютере с помощью cProfile я получил такой результат, но я ожидал, что они будут похожими.
Общее время
медленная_сумма (2000)
- 0.85 ms
быстрая_сумма (2000)
- 0.05 ms
Исходный файл: https://pastebin.com/fDfaSqyZ
Мой вывод: https://pastebin.com/wyy3v3iy
sum((i+j) for j in range(size) for i in range(size))
- person iz_   schedule 27.01.2019str.join
; попробуйте это с генератором против списка и сравните результаты - person smac89   schedule 27.01.2019str.join
, потому что ему все равно нужен список, а если его нет, он его создает. Не в случаеsum
- person Jean-François Fabre   schedule 27.01.2019slow_sum
должен выполнять отдельные операции добавления Python;fast_sum
суммирует список в C. - person chepner   schedule 27.01.2019size = 1000
, 10 раз сtimeit
:fast 1.25320039 - slow 1.1005855780000002
- person iGian   schedule 27.01.2019sum
или во фрейме стека понимания списка. - person user2357112 supports Monica   schedule 27.01.2019