On 01.12.2013 22:59, Dan Goodman wrote:
> Julian Taylor <jtaylor.debian <at> googlemail.com> writes:
>> your sin and exp calls are loop invariants, they do not depend on the
>> loop iterable.
>> This allows to move the expensive functions out of the loop and only
>> leave some simple arithmetic in the body.
> 
> Ahhhh! I feel extremely stupid for not realising this! Thanks Julian.
> 
> Any thoughts on why using -ffast-math it actually goes slower for just doing
> sin(x)?
> 

no on my linux machine ffast-math is a little faster:
numpy: 311 ms
weave_slow: 291 ms
weave_fast: 262 ms


here is a pure numpy version of your calculation which only performs 3
times worse than weave:

def timefunc_numpy2(a, v):
    ext = exp(-dt/tau)
    sit = sin(2.0*freq*pi*t)
    bs = 20000
    for i in range(0, N, bs):
        ab = a[i:i+bs]
        vb = v[i:i+bs]
        absit = ab*sit + b
        vb *= ext
        vb += absit
        vb -= absit*ext

it works by replacing temporaries with inplace operations and blocks the
operations to be more memory cache friendlier.
using numexpr should give you similar results.
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to