FAQ
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.

Search Discussions

  • Diez B. Roggisch at Jul 19, 2006 at 4:05 pm

    jedi200581 at 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
  • John Machin at Jul 19, 2006 at 8:05 pm

    On 20/07/2006 1:58 AM, jedi200581 at 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
  • John Machin at Jul 19, 2006 at 8:17 pm

    On 20/07/2006 6:05 AM, John Machin wrote:
    On 20/07/2006 1:58 AM, jedi200581 at 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):
  • Jedi200581 at Jul 20, 2006 at 6:48 am

    John Machin wrote:
    On 20/07/2006 6:05 AM, John Machin wrote:
    On 20/07/2006 1:58 AM, jedi200581 at 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.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedJul 19, '06 at 3:58p
activeJul 20, '06 at 6:48a
posts5
users3
websitepython.org

People

Translate

site design / logo © 2022 Grokbase