【发布时间】:2016-08-28 05:04:30
【问题描述】:
我需要计算一个单位正方形内 2 个随机均匀分布的点之间的距离的期望值。这个问题可以解析求解,答案约为 0.521405。我想要完成的是使用随机数生成器和 Python (有和没有 numpy)来得出这个数字。使用下面的代码
dist=list()
random.seed()
for each in range(100000000):
x1=random.random()
x2=random.random()
y1=random.random()
y2=random.random()
dist.append(math.sqrt((x1-x2)**2+(y1-y2)**2))
print(round(sum(dist)/float(len(dist)),6))
它在我的机器上在 125 秒内迭代 1 亿次,但只有 4 个十进制数字是正确的。 现在,我使用 numpy 创建了以下代码
dist=list()
start_time = time.time()
np.random.seed()
for each in range(100000000):
x = np.array((np.random.random(),np.random.random()))
y = np.array((np.random.random(),np.random.random()))
dist.append(np.linalg.norm(x-y))
print(round(np.mean(dist),6))
同样的 1 亿次迭代需要 1111 秒!
由于结果最多只有 4 位十进制数字是正确的,我尝试将迭代次数增加到 10 亿使用以前的版本,没有 numpy。我想,因为每个浮点数都在大多数 64 位(我使用的是 64 位 Python)列表大约需要 8 GB。 但是,当列表有 7.9 亿项
时,程序用尽了 26GB 的内存并抛出异常所以我正在就以下问题征求您的意见:
- 有没有办法利用各种 numpy 优化并真正让它工作得更快?
- 有没有办法让程序更节省内存?我意识到列表是一种比我需要的更复杂的数据结构
- 我是否正确假设为了正确获得 6 位十进制数字,我需要接近 10^12 的迭代次数? (因为 N 次测量的标准误差随着 1/sqrt(N) 递减)
提前致谢!
【问题讨论】:
-
你应该创建一个
x和y,每个都有 10m 的值 - 查看random的文档。然后尝试找到一种方法来一次性计算距离(即没有循环)。
标签: python list numpy random out-of-memory