[Numpy-discussion] In-place operations
Johannes Loehnert
a.u.r.e.l.i.a.n at gmx.net
Wed Sep 13 04:23:50 EDT 2006
Hi,
one word in advance, instead of optimizing it is advisable to seek for a way
to refactorize the algorithm using smaller arrays, since this kind of
optimization almost certainly reduces readability. If you do it, comment
well. ;-)
If you have very large arrays and want to do some arithmetics on it, say
B = 2*B + C
you can use inplace operators to avoid memory overhead:
B *= 2
B += C
Another trick which works in most situations is to do the outermost loop in
python:
for i in xrange(len(B)):
B[i] = 2*B[i] + C[i]
This reduces the temporary array size to 1/len(B) while still being fast (if
the other dimensions are large enough). For very large 1d arrays, you could
split them into chunks of a certain size.
However, you have to be careful that your calculation does not access
already-calculated elements of B. Consider the following example:
In [2]: B=arange(10)
In [3]: B+B[::-1]
Out[3]: array([9, 9, 9, 9, 9, 9, 9, 9, 9, 9])
In [4]: B += B[::-1]
In [5]: B
Out[5]: array([ 9, 9, 9, 9, 9, 14, 15, 16, 17, 18])
Johannes
More information about the NumPy-Discussion
mailing list