Скажем, у меня есть два фрагмента кода в python:
1 --------------------------
import numpy as np
x = np.array([1,2,3,4])
y = x
x = x + np.array([1,1,1,1])
print y
2 --------------------------
import numpy as np
x = np.array([1,2,3,4])
y = x
x += np.array([1,1,1,1])
print y
Я думал, что результат y
будет одинаковым в обоих примерах, так как y
укажет на x
и x
станет (2,3,4,5)
, НО, это не было
Результаты были (1,2,3,4) for 1
и (2,3,4,5) for 2
.
После некоторого исследования я выясню, что в первом примере
#-First example---------------------------------------
x = np.array([1,2,3,4]) # create x --> [1,2,3,4]
y = x # made y point to x
# unril now we have x --> [1,2,3,4]
# |
# y
x = x + np.array([1,1,1,1])
# however this operation **create a new array** [2,3,4,5]
# and made x point to it instead of the first one
# so we have y --> [1,2,3,4] and x --> [2,3,4,5]
#-Second example--------------------------------------
x = np.array([1,2,3,4]) # create x --> [1,2,3,4]
y = x # made y point to x
# unril now the same x --> [1,2,3,4]
# |
# y
x += np.array([1,1,1,1])
# this operation **Modify the existing array**
# so the result will be
# unril now the same x --> [2,3,4,5]
# |
# y
Вы можете узнать больше об этом поведении (не только в этом примере) в этой ссылке Алгоритм на месте
Мой вопрос: осознавая это поведение, почему я должен использовать алгоритм на месте с точки зрения производительности? (время извлечения быстрее? меньше памяти alocation?..)
РЕДАКТИРОВАТЬ: Уточнение
Примером (+, = +) было просто объяснить просто локальный алгоритм тому, кто этого не знает.. но вопрос в целом заключался в использовании локального алгоритма не только в этом случае..
В качестве еще одного более сложного примера: загрузка CSV файла (всего 10 миллионов строк) в переменную, а затем сортировка результата, заключается в том, что идея локального алгоритма состоит в том, чтобы производить вывод в том же пространстве памяти, который содержит входные данные последовательно преобразовывая эти данные до тех пор, пока не будет произведен выход? - Это позволяет избежать необходимости использовать дважды хранилище - одну область для ввода и область равного размера для вывода (использование минимального объема ОЗУ, жесткого диска...)