[Tutor] how to handle very large numbers
Dave Angel
d at davea.name
Mon Jan 23 14:00:35 CET 2012
On 01/23/2012 07:32 AM, Surya K wrote:
>
>
>
>> Date: Sun, 22 Jan 2012 21:28:14 -0500
>> From: d at davea.name
>> To: suryak at live.com
>> CC: tutor at python.org
>> Subject: Re: [Tutor] how to handle very large numbers
>>
>> On 01/22/2012 09:08 PM, Surya K wrote:
>>> Well,
>>> I have been doing a puzzle where I have to deal with number 10^18. A variable can store that value but can't do operations.Ex: If I use range() on it, it shows overflow error.
>>> So, How do I handle this. I have to use range() for that number.. in this instance.
>>> Also mention how to handle in other cases too (A small tutorial/ book would be appreciated )
>>>
>>> Thanks
>>>
>> Check out the ongoing thread of someone who's probably doing the same
>> assignment. Subject is "OverflowError in lucky numbers script"
>>
>> Short answers for range(): You need to specify your Python version.
>>
>> In Python 2.7, range() has no problem handling longs as its arguments.
>> It does have a problem when the number of items gets too large for
>> memory. You could avoid the memory problem by using xrange(), which is
>> restricted to ints. You can, however, write a generator to operate over
>> a series of such longs.
>>
>> I don't believe Python 3.x range has any constraints, and it's already a
>> generator, so you'll have to be more specific about what your
>> environment is.
>>
>>
>> --
>>
>> DaveA
>>
>
> I am using Python 2.7. I don't think range() can take large values.
> example:
> I took a = 1000000000000000000 (10^18); This is the max limit in a puzzle.
> python showed the following error :OverflowError: range() has too many items.
> I even tried using xrange(), I didn't solve the issue..
>
Presumably you tried something like range(a), in which case you tried to
create a list of 10**18 items, which is clearly too large for memory.
But range(a, a+1000) would be perfectly fine. So it's not a case of
range not accepting large values, but merely a question of how much will
fit in memory.
As I said, just write your own generator to replace xrange, and you're
fine. You haven't said yet what you plan to do with it, but if you just
want a generator for consecutive integers, you can use (untested)
def myrange(a, b):
while a < b:
yield a
a += 1
It's not quite as flexible as xrange, nor as fast, but it's easy to type.
By the way, if you're evaluating some useful function for a few
quadrillion items, running out of memory will be the least of your
worries. Usually, when the assignment involves huge numbers, there's a
better approach than starting from zero.
--
DaveA
More information about the Tutor
mailing list