内存错误Python

San*_*Arv 0 python montecarlo python-2.7

我正在尝试处理蒙特卡罗算法来计算pi的值.当我尝试提供如下程序中提到的大量输入时.我收到内存错误.我该怎么做才能纠正它?代码如下:

def PiCalc():
    N_ok=0  
    n=1000000000000 

    for i in range(n):  
        x=random()  
        y=random() 

        if sqrt(x**2 + y**2) <= 1:  
            N_ok+=1  
    pi= 4.0 * N_ok / n 

    print "No. of points inside the circle: ", N_ok
    print "Pi: ", pi
    return pi 
Run Code Online (Sandbox Code Playgroud)

aka*_*kin 5

在Python 2.7 range(n)中将创建一个包含1000000000000个元素的列表,这会导致MemoryError

使用xrange(n)你可以随时生成项目

根据文件:

xrange(start,stop [,step]) 此函数与range()非常相似,但返回xrange对象而不是list.这是一个不透明的序列类型,它产生与相应列表相同的值,而不是实际同时存储它们.xrange()在range()上的优势很小(因为xrange()在被要求时仍然需要创建值)


And*_*ini 5

鉴于没有人提到这个......

你也可以使用itertools.repeat(None, n).这将是比都快得多range并且xrange,因为它不会产生一个新trilion int实例.

随着repeat(),你的for循环成为这样:

for _ in itertools.repeat(None, n):
    x=random()
    y=random()
    if x**2 + y**2 <= 1:
        N_ok += 1
Run Code Online (Sandbox Code Playgroud)