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)
在Python 2.7 range(n)中将创建一个包含1000000000000个元素的列表,这会导致MemoryError
使用xrange(n)你可以随时生成项目
根据文件:
xrange(start,stop [,step]) 此函数与range()非常相似,但返回xrange对象而不是list.这是一个不透明的序列类型,它产生与相应列表相同的值,而不是实际同时存储它们.xrange()在range()上的优势很小(因为xrange()在被要求时仍然需要创建值)
鉴于没有人提到这个......
你也可以使用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)
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |