Strange result with timeit execution time measurment

Peter Otten __peter__ at web.de
Sat Nov 15 12:59:22 EST 2014


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).





More information about the Python-list mailing list