ОБНОВЛЕННЫЙ ОТВЕТ:
Да, данные итераций потребляются до перехода к slice ():
Для эмпирического доказательства простой пример с памятью ок. потребляющих:
1.) Пример кода с 10e6 элементами массива.
from itertools import islice
from heapq import merge
c = [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5] + list(range(int(10e6)))
lo, mid, hi = 0, 10, 20
c[lo:hi] = merge(islice(iter(c), lo, mid), islice(iter(c), mid, hi))
Нет заметных затрат времени и памяти.
2.) Тот же код с 10e7 элементами массива.
c = [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5] + list(range(int(10e7)))
означает 30% от общего потребления памяти той же конфигурации.
3.) Тот же код с 10e8 элементами массива.
Заканчивается в 100% + памяти, конечно.
Обратите внимание, что объем нарезки остался прежним , но память
потребление значительно увеличилось.