Python 优化抛硬币实验模拟

Python 优化抛硬币实验模拟,python,arrays,numpy,optimization,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 其总体思路是运行以下100000次实验模拟: 投掷10

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

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
其总体思路是运行以下100000次实验模拟: 投掷1000枚硬币,每枚硬币10次。使用大小为1000,10的numpy矩阵记录每个实验。行代表硬币,每列是一次投掷


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

您可以使用创建随机值的矩阵0理想情况下,执行以下操作:

import numpy as np
experiment = np.random.randint(0, 2, (100000, 1000, 10), dtype=np.uint8)
注意,这只需要100000*1000*10*1e-9=1G字节

在行动中:

>>> 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

为什么不直接做:coin_flips=np.random.randint0,2,size=1000,10?运行一次或百万次不会改变它的概率,我想。这也是只做99999次模拟,扔掉第一次99998的结果…我完全知道你的评论。为了简单起见,我只发布了完整代码的一部分。迪瓦卡的建议很好,我会用它。是的,这需要一段时间:你要做十亿次抛硬币。在我的硬件上进行10亿次迭代需要一分钟多一点。@Prune啊,numpy的威力:进行10亿次随机数生成需要3秒!
>>> 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