[Tutor] Why does counting to 20 million stress my computer? (original) (raw)

Dick Moores rdm at rcblue.com
Wed Jul 21 06:51:04 CEST 2004


Alan Gauld wrote at 10:53 7/20/2004:

> for k in range(max):

This line creates a list of max numbers. Each number takes up several bytes of RAM(4+?). So 20 million numbers is over 80MB RAM being used. You probably should investigate generators for this kind of thing, or at least use xrange() instread of range() Alan G.

Yes, I went with xrange(). But you've got me curious. I looked up generators in Learning Python, 2nd ed. Not sure I understand them, but would you expect using a generator to be a faster way to count than using xrange()? Could you give me an example that would fit my spin3.py below?

Thank you,

Dick Moores

========================================== #spin3.py

import time print """ Enter a positive integer n to count to n millions from zero. The counting will be done in two separate ways, and both will be timed. To quit, enter x or q at the prompt. """

while True: # for exiting via ^C or ^D try: max = raw_input("positive integer: ") except (TypeError, EOFError): print "Bye." break if len(max) == 0: print "Hey, don't just hit Enter, type an integer first!" continue if max in ["q", "x"]: print "Bye." break try: max = int(max) * 1000000 + 1 except: print "That's not an integer!" continue if max <= 0: print "That's not a positive integer!" continue print "Counting.." tStart = time.time() for k in xrange(max): pass tEnd = time.time() print "0 to %d in %.3f seconds!" % (k, (tEnd - tStart))

 print "And now counting using a different loop.."
 c = 0
 tStart = time.time()
 while c < max -1 :
     c += 1
 tEnd = time.time()
 print "0 to %d in %.3f seconds!" % (c, (tEnd - tStart))

======================================

-------------- next part -------------- #spin3.py

import time print """ Enter a positive integer n to count to n millions from zero. The counting will be done in two separate ways, and both will be timed. To quit, enter x or q at the prompt. """

while True: # for exiting via ^C or ^D try: max = raw_input("positive integer: ") except (TypeError, EOFError): print "Bye." break if len(max) == 0: print "Hey, don't just hit Enter, type an integer first!" continue if max in ["q", "x"]: print "Bye." break try: max = int(max) * 1000000 + 1 except: print "That's not an integer!" continue if max <= 0: print "That's not a positive integer!" continue print "Counting.." tStart = time.time() for k in xrange(max): pass tEnd = time.time() print "0 to %d in %.3f seconds!" % (k, (tEnd - tStart))

print "And now counting using a different loop.."
c = 0
tStart = time.time()
while c < max -1 :
    c += 1
tEnd = time.time()
print "0 to %d in %.3f seconds!" % (c, (tEnd - tStart))


More information about the Tutor mailing list