Strange result with timeit execution time measurment

2014-11-15 Thread ast

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, 100)

[1.999461539373, 1.9020670224846867, 1.9191573230675942]


t2.repeat(3, 100)

[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 ?

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


Re: Strange result with timeit execution time measurment

2014-11-15 Thread Peter Otten
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, 100)
 [1.999461539373, 1.9020670224846867, 1.9191573230675942]
 
 t2.repeat(3, 100)
 [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)'
100 loops, best of 3: 0.188 usec per loop
$ python -m timeit -s 'from test import sinusLite as sin' 'sin(.7)'
100 loops, best of 3: 0.972 usec per loop
$ python -m timeit -s 'sin = lambda x: None' 'sin(.7)'
100 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)'
1 loops, best of 3: 0.00459 usec per loop
$ pypy -m timeit -s 'from math import sin' 'sin(.7)'
1000 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


Re: Strange result with timeit execution time measurment

2014-11-15 Thread Peter Pearson
On Sat, 15 Nov 2014 18:07:30 +0100, ast wrote:

 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, 100)
 [1.999461539373, 1.9020670224846867, 1.9191573230675942]

 t2.repeat(3, 100)
 [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 ?

I suppose math.sin is implemented in C.  Compiled languages (like C) are
much faster than interpreted languages like Python.

-- 
To email me, substitute nowhere-runbox, invalid-com.
-- 
https://mail.python.org/mailman/listinfo/python-list


Re: Strange result with timeit execution time measurment

2014-11-15 Thread Ian Kelly
On Sat, Nov 15, 2014 at 10:07 AM, ast nom...@invalid.com 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, 100)

 [1.999461539373, 1.9020670224846867, 1.9191573230675942]

 t2.repeat(3, 100)

 [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 ?

The built-in sin is written in C, and the C implementation on most
modern systems boils down to a single assembly instruction implemented
in microcode. That's generally going to be faster than a whole series
of operations written in Python. Even just doing the 2*pi
multiplication in Python will add a lot to the timing:

C:\python -m timeit -s import math math.sin(2*math.pi*0.7)
100 loops, best of 3: 0.587 usec per loop

C:\python -m timeit -s import math math.sin(4.39)
100 loops, best of 3: 0.222 usec per loop
-- 
https://mail.python.org/mailman/listinfo/python-list