473,836 Members | 1,586 Online

# Weird MemoryError issue

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 1485
je********@yaho o.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
On 20/07/2006 1:58 AM, je********@yaho o.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(536870 911), 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
On 20/07/2006 6:05 AM, John Machin wrote:
On 20/07/2006 1:58 AM, je********@yaho o.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

John Machin wrote:
On 20/07/2006 6:05 AM, John Machin wrote:
On 20/07/2006 1:58 AM, je********@yaho o.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 thread has been closed and replies have been disabled. Please start a new discussion.