2013-03-14 9 views
18

Безопасно ли в python numexpr назначать значения одному и тому же массиву, на котором вы работаете, чтобы избежать создания временного массива?numexpr.evaluate ("a + b", out = a)

Из описания использования памяти на project homepage это выглядит нормально, но без погружения в исходный код это вряд ли является солидным ответом.

Я попытался следующий, работает отлично, но я надеюсь на подтверждение от кого-то более знакомого с этим пакетом:

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.]) 
+7

Я не могу придумать случай, когда это не было бы безопасно с моей головы (многие начинающие индексирования, которые потенциально могут вызвать проблемы, не работают в numexpr для начала). На стороне примечания, для простых случаев, подобных вашему примеру, также полезно знать: 'np.add (a, b, out = a)'. 'numexpr' чрезвычайно приятен, но можно избежать временных массивов без него, если вам не нужна другая зависимость. –

ответ

7

Это работает, потому что numexpr до сих пор использует временные массивы внутри, хотя и в куске размере 1024 элементов (или 4096 при использовании VML). Вы можете думать об этих кусках входов в виде срезов, хотя они сохраняются в качестве соответствующих типов данных C для скорости и компактности памяти во время оценки. Результаты будут сохранены в параметр out после вычисления каждого фрагмента, иначе он должен выделить массив того же размера, что и входы.

Ознакомьтесь с разделом Why It Works для псевдокода о том, как numexpr оценивает векторизованную арифметику.

 Смежные вопросы

  • Нет связанных вопросов^_^