Python Segfault,来自范围?

时间:2013-09-10 04:41:18

标签: python recursion

所以我试图生成小于2000000的素数并找到它们的总和..对于样本大小我尝试质数为40000,但得到了分段错误。我尝试了很多值,我发现数字35044是该程序的崩溃点。

import sys
sys.setrecursionlimit(100000000)
def stuff(total, rnge):
    for n in rnge:
        ubound=int(n**0.5)+1
        print ubound
        for x in range(3, ubound, 2):
            if n % x == 0:
                stuff(total, range(n+2, 35044, 2))
        #print n
        total = total + n
            #print total
    print total
    exit()
stuff(17, range(11, 35044, 2))

这是导致错误的结果:"Run Command: line 1: 2942 Segmentation fault: 11 python "$1" "${@:3}" 旁注:Finder还说python崩溃并给我一个崩溃报告,包括这两个有趣的信息:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00007fff5f3fffb8

不确定这是否有用。

另外,对于那些想知道的人,我使用最新的15英寸rMPB,配备16 GB RAM和2.7 Ghz处理器,当我运行该程序时,吃了14GB或者一些空闲的内存,然后在打印后崩溃数次181次。

2 个答案:

答案 0 :(得分:2)

当你遇到像你发现的堆栈问题时,没有理由使用递归,特别是如果你的目标语言不支持尾调用优化 - 比如Python。

这是一个替代的,非常天真的实现( O(n ^ 2)),但它没有递归就这样做,所以它可以用来求和任意数量的素数,虽然速度很慢候选窗口变得更大。

from math import sqrt    
total = 1+2
for i in range(3,2000000):
    for j in range (2,int(sqrt(i)+1)):
        if i%j==0:break
    else:
        total+=i
print total

答案 1 :(得分:1)

对您的函数的递归调用是否可能耗尽系统的可用内存?