Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Weird MemoryError issue

Reply
Thread Tools

Weird MemoryError issue

 
 
jedi200581@yahoo.co.uk
Guest
Posts: n/a
 
      07-19-2006
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.

 
Reply With Quote
 
 
 
 
Diez B. Roggisch
Guest
Posts: n/a
 
      07-19-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) 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
 
Reply With Quote
 
 
 
 
John Machin
Guest
Posts: n/a
 
      07-19-2006
On 20/07/2006 1:58 AM, (E-Mail Removed) 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
 
Reply With Quote
 
John Machin
Guest
Posts: n/a
 
      07-19-2006
On 20/07/2006 6:05 AM, John Machin wrote:
> On 20/07/2006 1:58 AM, (E-Mail Removed) wrote:
>> def is_prime n:

>
> Syntax error. Should be:
> def is_prime n:


Whoops! Take 2:

Should be:

def is_prime(n):

 
Reply With Quote
 
jedi200581@yahoo.co.uk
Guest
Posts: n/a
 
      07-20-2006

John Machin wrote:
> On 20/07/2006 6:05 AM, John Machin wrote:
> > On 20/07/2006 1:58 AM, (E-Mail Removed) 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.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
MemoryError - IMAP retrieve self._sock.recv(recv_size) Stephen G Python 0 10-18-2006 12:25 PM
MemoryError Numarray Bernhard Reimar Hoefle Python 0 09-26-2005 07:03 AM
MemoryError with parser.suite and wrong encoding declaration Sylvain Thenault Python 2 01-18-2005 04:03 PM
MemoryError in socket.py on Windows XP Jamie Python 0 11-27-2003 03:37 AM
MemoryError: out of memory Python 2.1.3 on Windows 2000 Andy Rechenberg Python 0 08-27-2003 03:59 PM



Advertisments