Numexpr.evaluate( "A + B", из = а)
Безопасно ли в python numexpr назначать значения одному и тому же массиву, на котором вы работаете, чтобы избежать создания временного массива?
Из описания использования памяти на домашней странице она выглядит нормально, но без погружения в исходный код это вряд ли является солидным ответом.
Я попробовал следующее, что прекрасно работает, но я надеюсь получить подтверждение от кого-то, более знакомого с этим пакетом:
import numpy as np
import numexpr as ne
a = np.ones(5)
b = a.copy()
ne.evaluate("a+b",out=a)
array([ 2., 2., 2., 2., 2.])
Ответы
Ответ 1
Это работает, потому что numexpr по-прежнему использует временные массивы внутри, хотя в размерах блоков 1024 элемента (или 4096 при использовании VML). Вы можете думать об этих кусках входов в виде срезов, хотя они сохраняются в качестве соответствующих типов данных C для скорости и компактности памяти во время оценки. Результаты будут сохранены в параметр out после вычисления каждого фрагмента, иначе он должен выделить массив того же размера, что и входы.
Ознакомьтесь с разделом Why It Works для псевдокода о том, как numexpr оценивает векторизованную арифметику.