我想优化我编写的模拟。我将提供我创建的代码,之后我将解释我想要实现的主要想法:
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分钟来运行这个简单的代码。
答案 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)