优化“抛硬币”实验模拟

时间:2017-11-03 18:17:29

标签: python arrays numpy optimization

我想优化我编写的模拟。我将提供我创建的代码,之后我将解释我想要实现的主要想法:

for exp_itrs in range(99999):
    coin_flips = np.zeros((1000,10))
    for toss in range(999):
        toss_10 = np.random.randint(0,2,size = (10))
        coin_flips[toss] = toss_10

这样做的一般想法是运行以下实验模拟100,000次: 折腾1000枚硬币,每枚硬币10次。使用大小为(1000,10)的numpy矩阵来记录每个实验(行代表硬币,每列都是一次折腾)。

现在,我的电脑需要大约5分钟来运行这个简单的代码。

2 个答案:

答案 0 :(得分:1)

理想情况下,执行以下操作:

import numpy as np
experiment = np.random.randint(0, 2, (100000, 1000, 10), dtype=np.uint8)

注意,这只需要100000 * 1000 * 10 * 1e-9 = 1千兆字节

行动中:

>>> import numpy as np
>>> experiment = np.random.randint(0, 2, (100000, 1000, 10), dtype=np.uint8)
>>> means = experiment.mean(axis=(0,1))
>>> means
array([ 0.50002927,  0.49993242,  0.5000543 ,  0.49999995,  0.49997455,
        0.49999587,  0.4999641 ,  0.4999488 ,  0.50001366,  0.50000301])
>>> experiment.nbytes
1000000000
>>> experiment.nbytes * 1e-9 # plenty of RAM to spare
1.0

在我相对适中的笔记本电脑上:

>>> timeit.timeit("experiment = np.random.randint(0, 2, (100000, 1000, 10), dtype=np.uint8)", "import numpy as np", number=10)
29.73300809401553
>>> _ / 10
2.973300809401553 # seconds per experiment

答案 1 :(得分:0)

您可以使用numpy.random.rand创建一个随机值矩阵0< = x<然后使用< 0.5的阈值将其别名为值0或1。

numpy.random.rand(10000, 1000, 10)