Нарезка пустого массива не делает копию, как в случае со списком.
В качестве основного примера:
import numpy as np
x = np.arange(100)
y = x[1:5]
y[:] = 1000
print x[:10]
Это приводит к:
[ 0 1000 1000 1000 1000 5 6 7 8 9]
Несмотря на то, что мы изменили значения в y
, это просто представление в той же памяти, что и x
.
Нарезка ndarray возвращает представление и нене дублируй память.
Однако было бы гораздо эффективнее использовать array_[1:].sum()
вместо вызова встроенного в Python sum
для простого массива.
В качестве быстрого сравнения:
In [28]: x = np.arange(10000)
In [29]: %timeit x.sum()
100000 loops, best of 3: 10.2 us per loop
In [30]: %timeit sum(x)
100 loops, best of 3: 4.01 ms per loop
Редактировать:
В случае списка, если по какой-то причине вы не хотите делать копию, вы всегда можете использовать itertools.islice
.Вместо:
result = sum(some_list[1:])
вы можете сделать:
result = sum(itertools.islice(some_list, 1, None))
В большинстве случаев это излишне.Если вы работаете со списками достаточно долго, чтобы управление памятью являлось серьезной проблемой, то вам, вероятно, не следует использовать список для хранения ваших значений.(Списки не предназначены или не предназначены для компактного хранения элементов в памяти.)
Кроме того, вы не захотите делать это для пустых массивов.Простое выполнение some_array[1:].sum()
будет на несколько порядков быстрее и не будет использовать любой больше памяти, чем islice
.