Учитывая два нормальных списки питона, newlist
и oldlist
, с целым числом index
< len(oldlist)
, я хотел бы выполнить следующую операцию:Устранить эту ненужную копию в list.extend
newlist.extend(oldlist[index:])
, но без создания промежуточного список oldlist[index:]
, или, что эквивалентно,
newlist.extend(oldlist[i] for i in xrange(index, len(oldlist)))
без накладных расходов генератора. Возможно ли это без использования C?
Редактировать: Этот вопрос вытекает из некоторых примеров реализации некоторых операций с списком, в частности для list.extend()
, когда интерпретатор определяет, что он может угадать размер хвоста, добавляемого в список, он выделяет полный размер в главный список и копирует элементы по мере их создания; для других случаев он выделяет несколько элементов за раз (около восьми, если используется память) и копирует элементы в несколько раз за раз.
Конкретные случаи, когда он выполняет полное распределение, по-видимому, для списков python и нескольких других типов, которые имеют __len__
. Насколько я могу судить, нет встроенного типа «просмотра списка», который бы удовлетворял этим требованиям.
Есть ли у вас эталонные тесты, которые показывают, что генератор или срез имеют значительные накладные расходы? –
'islice' может иметь более низкие накладные расходы. все же генератор. – aaronasterling
Генератор не должен иметь заметных накладных расходов. –