2013-03-14 23 views
18

Czy w python numexpr jest bezpieczne przypisywanie wartości do tej samej macierzy, na której pracujesz, aby uniknąć tworzenia tymczasowej tablicy?numexpr.evaluate ("a + b", out = a)

Z opisu użycia pamięci na project homepage wygląda dobrze, ale bez zanurzania się w kodzie źródłowym, to nie jest solidna odpowiedź.

Próbowałem następujących który działa dobrze, ale mam nadzieję na potwierdzenie od kogoś bardziej znanego z tego pakietu:

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

Nie mogę wymyślić przypadku, w którym nie byłoby to bezpieczne z mojej strony (wiele indeksujących lew, które potencjalnie mogłyby spowodować problemy, nie działają na początku w numexpr). Na marginesie, dla prostych przypadków, takich jak twój przykład, warto również pamiętać o: 'np.add (a, b, out = a)'. 'numexpr' jest niezwykle przyjemny, ale bez niego można uniknąć tymczasowych tablic, jeśli nie chcesz innej zależności. –

Odpowiedz

7

To działa, ponieważ numexpr nadal wykorzystuje tymczasowe tablice wewnętrznie, aczkolwiek w rozmiarach fragmentach 1024 elementy (lub 4096 przy użyciu VML). Te fragmenty danych wejściowych można traktować jako plasterki, ale są one zapisywane jako odpowiednie typy danych C dla szybkości i zwartości pamięci podczas oceny. Wyniki zostaną zapisane w parametrze wyjściowym po wykonaniu obliczenia każdej porcji, w przeciwnym razie należy przydzielić tablicę o tym samym rozmiarze, co dane wejściowe.

Zapoznaj się z sekcją Why It Works dotyczącą pseudokodu, w jaki sposób numexpr ocenia arytmetykę wektoryzacji.

Powiązane problemy