Контекст
Это общий вопрос об эффективности. У меня есть список, и мне нужен последовательный run/sublist из списка. Как правило, это делается с помощью кусочка:Python 3.5: slice vs islice vs alternatives? Сравнение эффективности
my_list[start:end]
однако, срез формирует копию исходного списка (по крайней мере, ссылки исходного списка). Таким образом, возможно, что эта операция медленнее, чем если бы она не делала этого.
islice
- альтернатива, которая вместо этого делает итератор. Так как я забочусь только о том, все значения в одном, а не переборе над ними, у меня будет набирать ролях:
list(islice(my_list, start, end))
Фоновая работа
Чтобы сделать некоторые сравнения я случайно нарезанные/isliced 10 раз в списках увеличения размера от 1 до 10000:
is_vals = []
s_vals = []
for l in range(1, 10000):
my_list = [random.random() for k in range(l)]
for p in range(10):
i = random.randint(0, l)
j = random.randint(0, l)
if i < j:
start_time = time.clock()
list(islice(my_list, i, j))
is_vals.append(time.clock() - start_time)
start_time = time.clock()
my_list[i:j]
s_vals.append(time.clock() - start_time)
else:
start_time = time.clock()
list(islice(my_list, j, i))
is_vals.append(time.clock() - start_time)
start_time = time.clock()
my_list[j:i]
s_vals.append(time.clock() - start_time)
print(statistics.mean(is_vals) - statistics.mean(s_vals))
, что я обнаружил, что кусочек еще быстрее, с той разницей между Ислицей и ломтиком быть 2.99e-05.
Я не уверен, но я пойду дальше и сделаю так, чтобы придумать объект итератора.
Вопрос
есть более эффективный способ, чем срез, чтобы получить подряд запустить/подсписок в списке?
Бонус: есть ли способ более или менее ввести тип списка/кортеж в срез? например поверните [i, j] в i: j?
Таким образом, оба метода создают новый объект списка. Зачем вообще смотреть на 'islice()' ** **, так как он может только ввести больше сложности? 'list()' вызывает 'iter()' на итераторе (который в этом случае возвращает 'self'). 'islice()' должен вызывать 'iter()' в списке (возвращающий объект итератора списка). Все вокруг, гораздо больше работы. –
Включение значения старта и остановки в срез, который вы можете сделать с помощью 'slice (i, j)'. Об этом уже говорилось в другом месте, см. [Как использовать двоеточие (:) в переменной] (// stackoverflow.com/q/40531795) или [Практическое руководство средой Python, я знаю кусочек Python, но как я могу использовать встроенные функции, в slice-объекте для этого?] (// stackoverflow.com/q/3911483) –
@MartijnPieters, следовательно, вопрос, я ищу альтернативу, и, возможно, новый список без ссылок на оригинал мог бы быть быстрее ... – SumNeuron