no sign() function ?
Pierre-Alain Dorange
pdorange at pas-de-pub-merci.mac.com
Mon Dec 22 08:51:32 EST 2008
Stephen Thorne <stephen at thorne.id.au> wrote:
> > def sign(x):
> > if x==0.0:
> > return 0.0
> > elif x>0.0:
> > return 1.0
> > else:
> > return -1.0
>
> Isn't this approximately this? ::
>
> def sign(x):
> return float(cmp(x, 0))
Yes cmp() is probably the closest function to sign.
I'm new to python and here i discover at least 4 methods, i just make a
small script for timing those methods (100 000 times each on a set of 10
values).
I do not use timeit, i can't make it work easyly as it need a standalone
env for each test.
---- the test script --------------------
#!/usr/bin/env python
from math import atan2
import time
def sign_0(x):
if x==0.0:
return 0.0
elif x>0.0:
return 1.0
else:
return -1.0
def sign_1(x):
if x > 0 or (x == 0 and atan2(x, -1.) > 0.):
return 1
else:
return -1
def sign_2(x):
return cmp(x, 0)
sign_3 = lambda x:+(x > 0) or -(x < 0)
def main():
candidates=[1.1,0.0,-0.0,-1.2,2.4,5.6,-8.2,74.1,-23.4,7945.481]
startTime = time.clock()
for i in range(100000):
for value in candidates:
s=sign_0(value)
print "sign_0 : ",time.clock() - startTime
startTime = time.clock()
for i in range(100000):
for value in candidates:
s=sign_1(value)
print "sign_1 : ",time.clock() - startTime
startTime = time.clock()
for i in range(100000):
for value in candidates:
s=sign_2(value)
print "sign_2 : ",time.clock() - startTime
startTime = time.clock()
for i in range(100000):
for value in candidates:
s=sign_3(value)
print "sign_3 : ",time.clock() - startTime
if __name__ == '__main__' :
main()
---- the results -----------------------------
My config :
iMac (2,66 GHz intel dual core 2 duo)
MacOS X 10.5.5
Python 2.5.1
sign_0 = 0.4156 second (0%)
sign_1 = 0.5316 second (+28%)
sign_2 = 0.6515 second (+57%)
sign_3 = 0.5244 second (+26%)
---- conclusions -------------------------------
1/ python is fast
2/ method (0) is the fastest
3/ cmp method (2) is the slowest
4/ the precise one (IEEE 754) is also fast (1)
--
Pierre-Alain Dorange <http://microwar.sourceforge.net/>
Ce message est sous licence Creative Commons "by-nc-sa-2.0"
<http://creativecommons.org/licenses/by-nc-sa/2.0/fr/>
More information about the Python-list
mailing list