views:

54

answers:

2

I'm quite new to python, so I'm doing my usual of going through Project Euler to work out the logical kinks in my head.

Basically, I need the largest list size possible, ie range(1,n), without overflowing.

Any ideas?

A: 

The size of your lists is only limited by your memory. Note that, depending on your version of Python, range(1, 9999999999999999) needs only a few bytes of RAM since it always only creates a single element of the virtual list it returns.

If you want to instantiate the list, use list(range(1,n)) (this will copy the virtual list).

Aaron Digulla
Are you assuming 3.x? On 2.x this is incorrect for the reason given in my own answer, and on 3.x it's still incorrect as long as you interpret "list" literally: list size is bound by `ssize_t` . Anyway, it's really silly to simply assume people are using 3.x .
Devin Jeanpierre
There is no doubt he's assuming 3.x; `sys.getsizeof(range(1e8))` returns `400000036` on 2.6 (and takes a noticeable time to compute). The 3.x analogy would be `sys.getsizeof(xrange(1e8))` that gives `20` and is instant.
Nick T
Which part if "depending on your version of Python" didn't you understand? :-(
Aaron Digulla
+3  A: 

Look at get_len_of_range and get_len_of_range_longs in the builtin module source

Summary: You'll get an OverflowError if the list has more elements than can be fit into a signed long. On 32bit Python that's 2**31 - 1, and on 64 bit Python that's 2**63 - 1. Of course, you will get a MemoryError even for values just under that.

Devin Jeanpierre
Very useful information - Thanks!
Bartek
I thought that the `sys.maxsize` limit only applied to `xrange`, not to Python 2's `range`. Of course it's pretty academic unless you have a great deal of memory...
Scott Griffiths
Quick follow up question; any easy way to query python as to how much it can cope with at the minute?
Andrew Bolster