Я хочу знать, создает ли нарезка копию списка и используем ли мы del над срезом. Тогда не создаст ли он копию, т.е. сначала новый объект из списка для данного слайса, а потом удалит его?
Поэтому, если программа действительно находится на месте, мы не можем использовать слайсы.
# suppose if I use something like this:
a = [1,2,3,4,5,6,7,8,9,0]
del a[5:]
Итак, не создаст ли этот del [a:]
копию a
в заданном фрагменте a[5:]
, а затем удалит ее?
Это так, это не будет операция на месте, так как мы используем фрагменты здесь.
Но
a = [1,2,3,4,5,6,7,8,9,0]
for i in range(5,len(a),-1):
del a[i]
Эта операция выполняется на месте, поскольку мы не используем срезы.
Так это должно быть быстрее, верно? Потому что нам не нужно мучиться с созданием нового слайса и прямым удалением объекта.
Но я проверил, и это наоборот:
%%timeit
a = [x for x in range(1000)]
del a[500:]
> 45.8 µs ± 3.05 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit
a = [x for x in range(1000)]
for i in range(999,499,-1):
del a[i]
> 92.9 µs ± 3.24 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Теперь, если мы предположим, что del a[500:]
сначала создает срез, а затем удаляет, тогда это не совсем на месте, и использование цикла for
для той же задачи на месте? Но тогда почему циклу требуется больше времени для выполнения задачи?
Так же, если на всякий случай предположить, что как-то они оба на месте и del a[500:]
не создает слайс-копию a
по этому индексу, а del
напрямую идет по индексу 500 и рекурсивно удаляет элементы, то что именно a[500:]
в этом утверждение? Просто сказать, откуда del
удалять?
Если да, то это не срез?
Я сослался на несколько ссылок, таких как приведенная ниже, чтобы найти ответ на этот вопрос, но я не очень ясно понимаю ни одно из объяснений, посвященных исключительно операциям in-place
.