Strange result with timeit execution time measurment
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
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
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
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