python - numexpr.evaluate(“a+b”,out=a)
numpy (1)
Funciona, porque numexpr todavía usa matrices temporales internamente, aunque en tamaños de trozos de 1024 elementos (o 4096 si se usa VML). Puede pensar en estos trozos de las entradas como segmentos, aunque se almacenan como tipos de datos C apropiados para la velocidad y la compacidad de la memoria durante la evaluación. Los resultados se almacenarán en el parámetro de salida después de que se realice el cálculo de cada fragmento, de lo contrario debe asignar una matriz del mismo tamaño que las entradas.
Consulte la sección Por qué funciona para ver el pseudocódigo de cómo numexpr evalúa la aritmética vectorizada.
¿Es seguro en python numexpr asignar valores a la misma matriz en la que está operando para evitar crear una matriz temporal?
A partir de la descripción del uso de la memoria en la página de inicio del proyecto, se ve bien, pero sin bucear en el código fuente, eso no es una respuesta sólida.
Intenté lo siguiente que funciona bien, pero espero la confirmación de alguien más familiarizado con este paquete:
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.])