Basically, indexing in Python is a little slower, the number of things indexing
can do is more varied, and more to the point, the objects returned from arrays
are NumPy scalars (which have math which is not optimized).
If you do element-by-element indexing, it's generally best to use Python lists
(this has always been true, even with Numeric). The item method on NumPy
arrays will speed up these kind of loops:
from numpy import arange
from time import clock
N = 100000
a = arange(N)
b = arange(N)
al = a.tolist()
bl = b.tolist()
t = clock()
for i in range(1, N-1):
pass
tpass = clock() - t
t = clock()
ai = a.item
for i in range(1, N-1):
val = ai(i) - t*(ai(i+1) - 2*ai(i) + ai(i-1)) + ai(i)*ai(i)*t
b.itemset(i, val % (2**31))
tfast = clock() - t
t = clock()
for i in range(1, N-1):
val = a[i] - t*(a[i+1] - 2*a[i] + a[i-1]) + a[i]*a[i]*t
b[i] = val % (2**31)
tslow = clock() - t
t = clock()
for i in range(1, N-1):
val = al[i] - t*(al[i+1] - 2*al[i] + al[i-1]) + al[i]*al[i]*t
bl[i] = val % (2**31)
tlist = clock() - t
print tpass, tfast, tslow, tlist
On my system, the list version is the fastest, while the itemset method is
about 10x faster than the full indexing approach. The item method not only
does faster indexing, but it also returns Python scalars rather than NumPy
scalars.
-Travis
_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion