[Tutor] Loop comparison
Dave Angel
davea at ieee.org
Fri Apr 16 10:31:09 CEST 2010
Christian Witts wrote:
> <div class="moz-text-flowed" style="font-family: -moz-fixed">Ark wrote:
>> Hi everyone.
>> A friend of mine suggested me to do the next experiment in python and
>> Java.
>>
>> It's a simple program to sum all the numbers from 0 to 1000000000.
>>
>> result = i = 0
>> while i < 1000000000:
>> result += i
>> i += 1
>> print result
>>
>> The time for this calculations was huge. It took a long time to give
>> the result. But, the corresponding program in Java takes less than 1
>> second to end. And if in Java, we make a simple type check per cycle,
>> it does not take more than 10 seconds in the same machine. I was not
>> expecting Python to be faster than Java, but it''s too slow. Maybe
>> Java optimizes this case and Python doesn't. Not sure about this.}
>>
>> Thanks
>> ark
>> _______________________________________________
>> Tutor maillist - Tutor at python.org
>> To unsubscribe or change subscription options:
>> http://mail.python.org/mailman/listinfo/tutor
>>
>>
> Different methods and their relative benchmarks. The last two
> functions are shortcuts for what you are trying to do, the last
> function 't5' corrects the mis-calculation 't4' has with odd numbers.
> Remember, if you know a better way to do something you can always
> optimize yourself ;)
>
> >>> def t1(upper_bounds):
> ... start = time.time()
> ... total = sum((x for x in xrange(upper_bounds)))
> ... end = time.time()
> ... print 'Time taken: %s' % (end - start)
> ... print total
> ...
> >>> t1(1000000000)
> Time taken: 213.830082178
> 499999999500000000
> >>> def t2(upper_bounds):
> ... total = 0
> ... start = time.time()
> ... for x in xrange(upper_bounds):
> ... total += x
> ... end = time.time()
> ... print 'Time taken: %s' % (end - start)
> ... print total
> ...
> >>> t2(1000000000)
> Time taken: 171.760597944
> 499999999500000000
> >>> def t3(upper_bounds):
> ... start = time.time()
> ... total = sum(xrange(upper_bounds))
> ... end = time.time()
> ... print 'Time taken: %s' % (end - start)
> ... print total
> ...
> >>> t3(1000000000)
> Time taken: 133.12481904
> 499999999500000000
> >>> def t4(upper_bounds):
> ... start = time.time()
> ... mid = upper_bounds / 2
> ... total = mid * upper_bounds - mid
> ... end = time.time()
> ... print 'Time taken: %s' % (end - start)
> ... print total
> ...
> >>> t4(1000000000)
> Time taken: 1.4066696167e-05
> 499999999500000000
> >>> def t5(upper_bounds):
> ... start = time.time()
> ... mid = upper_bounds / 2
> ... if upper_bounds % 2:
> ... total = mid * upper_bounds
> ... else:
> ... total = mid * upper_bounds - mid
> ... end = time.time()
> ... print 'Time taken: %s' % (end - start)
> ... print total
> ...
> >>> t5(1000000000)
> Time taken: 7.15255737305e-06
> 499999999500000000
> >>> t3(1999)
> Time taken: 0.0038161277771
> 1997001
> >>> t4(1999)
> Time taken: 3.09944152832e-06
> 1996002
> >>> t5(1999)
> Time taken: 3.09944152832e-06
> 1997001
>
A simpler formula is simply
upper_bounds * (upper_bounds-1) / 2
No check needed for even/odd.
DaveA
More information about the Tutor
mailing list