Понимание распределения памяти в numpy: выделяется ли «временная» память при сохранении результата операции в переменную [:,:]? - PullRequest
0 голосов
/ 12 ноября 2018

Предположим, два больших многомерных массива numpy a и b.Я хочу выполнить поэлементную операцию, например, добавив их элемент за элементом:

c = a + b

В приведенном выше случае новая память выделяется для результата a + b.Ссылка на эту память затем сохраняется в c.

Теперь давайте предположим, что память для c уже выделена.Установив число измерений равным двум, чтобы получить простой пример, я могу сделать следующее:

c[:, :] = a + b

Я не могу найти никакой документации о том, как точно реализовано вышеизложенное.Я могу представить себе два способа:

  1. Сначала выделяется память для выполнения операции a + b.Результат сохраняется в этой «временной» памяти до того, как данные, т. Е. Результат операции, копируются в c[:, :].
  2. Нет выделения временной памяти.Результат a + b переходит непосредственно в c[:, :].

Я немного поиграл с кодом и - я могу быть абсолютно не прав здесь - с точки зрения производительности кажется, что первый вариант более вероятен.Я прав?Если это так, как я могу избежать выделения «временной памяти» и напрямую сохранить результат в памяти, которая уже доступна в c?Я предполагаю, что мне нужно быть более явным, использовать такие функции, как numpy.add и предоставлять им ссылки на целевую память.

1 Ответ

0 голосов
/ 12 ноября 2018

Необходимая операция:

numpy.add(a, b, out=c)

При c[:, :] = a + b оценка a + b не содержит информации о том, что результат будет присвоен c[:, :].Он должен выделить новый массив для хранения результата a + b.

(последние версии NumPy пытаются выполнить некоторую проверку стека на уровне C , чтобы агрессивно оптимизировать временные значения, выходящие за рамки PythonМодель исполнения обычно допускает, но эти оптимизации не справляются с этим случаем. Вы можете увидеть код в temp_elide.c, включая некоторые примечания о том, на каких платформах он работает и почему недостаточно проверки стека Python.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...