如何防止以下代码的内存错误

时间:2016-06-23 16:11:27

标签: python python-2.7

这是我的python代码,它在主要测试用例中适用于小值,但由于大整数值而产生Memory Error。如何删除内存错误或如何在python中执行大整数操作?

#taking input testcases T
n=int(raw_input())

#taking value range upto iterate and find reversible numbers
_input_var = [int(raw_input()) for i in range(0,n)]


#function will reverse the number and return
def reverse(num):
    return int(str(num)[::-1])

#function will check odd confirmation for every digit 
def isDigitOdd(num):
    lista = str(num)
    for i in lista:
        if int(i)%2==0:
            flag = False
            return flag
        else:
            flag = True
    return flag

#main method
def main(_iter):    
    count=0
    for i in range(0,_iter):
        k = i + reverse(i)
        if i%10!=0 and isDigitOdd(k):
            count+=1
    print count

#calling main method for N number ranges
for i in _input_var:
    main(i)

2 个答案:

答案 0 :(得分:2)

最有可能的是,当一个大数字传递给range时,你的内存不足,因为它必须在内存中构建整个列表。将range来电替换为xrange

def main(_iter):    
    count=0
    for i in xrange(0,_iter):
        k = i + reverse(i)
        if i%10!=0 and isDigitOdd(k):
            count+=1
    print count

xrange是一个惰性生成器,与Python 3中的range类似,具有O(1)内存复杂性。 xrange在64位平台上使用64位C long int来存储内部状态,即限制几乎为±10 ^ 19(如果数字超过该限制,则会抛出OverflowError )。无论如何,正如我在评论中已经提到的(以及其他用户),你的算法太天真,无法处理大量输入。你必须减少渐近的复杂性。像O(log(n))这样的东西就可以了。

P.S。 一些小的优化

def isDigitOdd(num):
    return all(int(digit) % 2 for digit in str(num))

def main(_iter):    
    print(sum(i % 10 and isDigitOdd(i+reverse(i)) for i in xrange(0,_iter)))

答案 1 :(得分:0)

可能就是这条线

for i in range(0,_iter)

这将创建一个长度为_iter的列表,对于大值,这将是大量的。实际上你不需要存储整个列表;你只需要增加一个整数。相反,使用xrange,它会产生一个generator,它一次只能创建和存储一个整数:

for i in xrange(0,_iter)