455,446 Members | 1,541 Online
Need help? Post your question and get tips & solutions from a community of 455,446 IT Pros & Developers. It's quick & easy.

# Weird MemoryError issue

 P: n/a Hi, I'm new at python as I just started to learn it, but I found out something weird. I have wrote a little program to compute Mersenne number: # Snipet on def is_prime n: for i in range(2, n): if (n % i) == 0: return 0 else: return 1 for a in range(2, 10000000): if (is_prime(a) and is_prime(2**a-1)) print 2**a-1, " is a prime number" # Snipet off This program raise MemoryError. But this one: # Snipet on def is_prime n: for i in range(2, n): if (n % i) == 0: return 0 return 1 # the change is here for a in range(2, 10000000): if (is_prime(a) and is_prime(2**a-1)) print 2**a-1, " is a prime number" # Snipet off Does not! Why ?? Thx. Jul 19 '06 #1
4 Replies

 P: n/a je********@yahoo.co.uk wrote: Hi, I'm new at python as I just started to learn it, but I found out something weird. I have wrote a little program to compute Mersenne number: # Snipet on def is_prime n: for i in range(2, n): if (n % i) == 0: return 0 else: return 1 for a in range(2, 10000000): if (is_prime(a) and is_prime(2**a-1)) print 2**a-1, " is a prime number" # Snipet off This program raise MemoryError. But this one: # Snipet on def is_prime n: for i in range(2, n): if (n % i) == 0: return 0 return 1 # the change is here for a in range(2, 10000000): if (is_prime(a) and is_prime(2**a-1)) print 2**a-1, " is a prime number" # Snipet off Does not! Why ?? Don't use range, use xrange. The former will generate an actual list in memory, which you usually don't need - especially in for-loops as you don't even have a reference on the list itself. And I don't think that your change afflicts memory consumption at all. Must be a coincidence. Diez Jul 19 '06 #2

 P: n/a On 20/07/2006 1:58 AM, je********@yahoo.co.uk wrote: Hi, I'm new at python as I just started to learn it, but I found out something weird. I have wrote a little program to compute Mersenne number: # Snipet on def is_prime n: Syntax error. Should be: def is_prime n: for i in range(2, n): if (n % i) == 0: return 0 else: return 1 for a in range(2, 10000000): if (is_prime(a) and is_prime(2**a-1)) Syntax error (missing :) print 2**a-1, " is a prime number" # Snipet off This program raise MemoryError. But this one: # Snipet on def is_prime n: for i in range(2, n): if (n % i) == 0: return 0 return 1 # the change is here for a in range(2, 10000000): if (is_prime(a) and is_prime(2**a-1)) print 2**a-1, " is a prime number" # Snipet off Does not! Why ?? Neither of the above compiles without error. You may regard this as a novel suggestion (it's not), but try pasting the actual code that you ran. When corrected, the versions are functionally equivalent. They give the same result: on my box, they fell over trying to do is_prime(536870911), in particular trying to do range(536870911). If successful, that would produce a list of approx 0.5G elements. On a 32-bit box, that's about 2GB of pointers to objects. Each object has a reference count, a pointer to its type, and its value -- another 6GB. Total about 8GB. Use xrange() to avoid the memory grab. HTH, John Jul 19 '06 #3

 P: n/a On 20/07/2006 6:05 AM, John Machin wrote: On 20/07/2006 1:58 AM, je********@yahoo.co.uk wrote: >def is_prime n: Syntax error. Should be: def is_prime n: Whoops! Take 2: Should be: def is_prime(n): Jul 19 '06 #4

 P: n/a John Machin wrote: On 20/07/2006 6:05 AM, John Machin wrote: On 20/07/2006 1:58 AM, je********@yahoo.co.uk wrote: def is_prime n: Syntax error. Should be: def is_prime n: Whoops! Take 2: Should be: def is_prime(n): Sorry for that, I was not able to cut-paste the code at the moment, and was in a hurry, I know it's bad. Thanks for "xrange", I tried and it works fine. Jul 20 '06 #5

### This discussion thread is closed

Replies have been disabled for this discussion.