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