Меня интересовало, когда я должен использовать генератор в функции, и когда мне нужно просто использовать список, поэтому я сделал несколько тестов с фильтрами и списками.Почему создание списка из объекта генератора занимает так много времени?
>>> timeit.timeit('list(filter(lambda x: x%10, range(10)))')
3.281250655069016
>>> timeit.timeit('[i for i in range(10) if i%10 != 0]')
2.6070076799951494
>>> timeit.timeit('filter(lambda x: x%10, range(10))')
0.7457015149993822
Затем я попытался с диапазоном (100):
>>> timeit.timeit('list(filter(lambda x: x%10, range(100)))')
27.73180518404115
>>> timeit.timeit('[i for i in range(100) if i%10 != 0]')
18.659852175973356
>>> timeit.timeit('filter(lambda x: x%10, range(100))')
0.7294546449556947
Почему это занимает так много больше, чтобы сделать список из объекта генератора, чем это делает, чтобы просто создать список? Если мне нужно было получить доступ к этому списку более одного раза, мне просто лучше было бы использовать понимание списка, а не создавать список из объекта-генератора?
@PadraicCunningham хорошо, не все ли они получают 'next', называемые несколько раз? Но да, чем больше вы это называете, тем больше времени требуется для завершения итерации в последовательности. –
@ Dandré, '[i для i в диапазоне (10), если i% 10! = 0]', где следующий вызов по отношению к самому списку? –
@PadraicCunningham range() - это генератор, который имеет неявный вызов 'next' –