[Numpy-discussion] timeit one big vs many little a[ogrid] = f(ogrid)
denis bzowy
denis-bz-py at t-online.de
Mon Sep 14 09:01:11 EDT 2009
Folks,
this simple timeit -> a largish speed ratio that surprised me --
but perhaps I've done something stupid ?
""" timeit one big vs many little a[ogrid] = f(ogrid)
Consider evaluating a function on an NxN grid, in 2 ways:
a) in one shot:
y,x = ogrid[0:N, 0:N]
a[y,x] = f(x,y)
b) piece by piece, covering the NxN with little nxn ogrids.
How much faster would you expect "one big" to be than "little",
say for N=256, n=8, *roughly* -- factor 2, factor 10, for a trivial f() ?
An application: for adaptive interpolation on a 2d grid (adalin2),
suppose we fill 8x8 squares either with f(ogrid), or interpolate().
*If* 8x8 piece by piece were 10* slower than 256x256 in one shot
doing 10 % of the (256/8)^2 little squares with f()
and interpolating 90 % in 0 time
would take the same time as f( 256x256 ) -- for trivial f().
In fact 10* is about what I see on one (1) platform, mac ppc
=> f() must be very expensive for interpolation to pay off.
("All models are wrong, but some are useful.")
Bottom line:
f( one big ogrid ) is fast, hard to beat.
"""
from __future__ import division
import timeit
import numpy as np
__date__ = "14sep 2009"
N = 256
Ntime = 10
print "# n msec a[ogrid] = f(ogrid) N=%d numpy %s" % (N, np.__version__)
n = N
while n >= 4: #{
timer = timeit.Timer(
setup = """
import numpy as np
N = %d
n = %d
def f(x,y):
return (2*x + y) / N
a = np.zeros(( N, N ))
""" % (N,n),
stmt = """
#...............................................................................
for j in range( 0, N, n ):
for k in range( 0, N, n ):
y,x = np.ogrid[ j:j+n, k:k+n ]
a[y,x] = f(x,y)
""" )
msec = timer.timeit( Ntime ) / Ntime * 1000
print "%3d %4.0f" % (n, msec)
n //= 2
#}
More information about the NumPy-Discussion
mailing list