ast wrote:

> Hi
> 
> I needed a function f(x) which looks like sinus(2pi.x) but faster.
> I wrote this one:
> 
> --------------------------
> from math import floor
> 
> def sinusLite(x):
>     x = x - floor(x)
>     return -16*(x-0.25)**2 + 1 if x < 0.5 else 16*(x-0.75)**2 - 1
> --------------------------
> 
> then i used module timeit to compare its execution time with math.sin()
> I put the sinusLite() function in a module named test.
> 
> then:
> 
>>>> import timeit
>>>> t1 = timeit.Timer("y=test.sinusLite(0.7)", "import test")
>>>> t2 = timeit.Timer("y=math.sin(4.39)", "import math")        ## 4.39 =
>>>> 2*pi*0.7
> 
>>>>  t1.repeat(3, 1000000)
> [1.9994622221539373, 1.9020670224846867, 1.9191573230675942]
> 
>>>> t2.repeat(3, 1000000)
> [0.2913627989031511, 0.2755561810230347, 0.2755186762562971]
> 
> so the genuine sinus is much faster than my so simple sinLite() !
> Amazing isnt it ? Do you have an explanation ?

You are applying your optimisation in an implementation where the function 
call overhead of a Python-implemented function is greater than the time to 
invoke the C-coded function, calculate the sin, and create the python float.

$ python -m timeit -s 'from math import sin' 'sin(.7)'
1000000 loops, best of 3: 0.188 usec per loop
$ python -m timeit -s 'from test import sinusLite as sin' 'sin(.7)'
1000000 loops, best of 3: 0.972 usec per loop
$ python -m timeit -s 'sin = lambda x: None' 'sin(.7)'
1000000 loops, best of 3: 0.242 usec per loop

For CPython to write fast lowlevel code you have to switch to C (or Cython).
In PyPy the results get interesting:

$ pypy -m timeit -s 'from test import sinusLite as sin' 'sin(.7)'
100000000 loops, best of 3: 0.00459 usec per loop
$ pypy -m timeit -s 'from math import sin' 'sin(.7)'
10000000 loops, best of 3: 0.0476 usec per loop

So yes, your approximation may speed up code in some parts of the Python 
universe (I don't know if pypy takes advantage of the constant argument).


-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to