我正在使用R和Python跟随《贝叶斯数据分析实例》中的练习。
我想找到一种使用恒定空间的快速蒙特卡罗模拟方法。
下面的问题很简单,但可以作为不同方法的良好测试:
ex 4.3
确定从洗牌后的pinochle牌组中抽取一个10的确切概率。 (在pinochle牌组中,有48张牌。有六个值:9、10、Jack、Queen、King、Ace。每个标准的四种花色:红心,方块,梅花,黑桃中都有两个相同的值。)
(A)获取10的概率是多少?
当然,答案是1/6。
我能找到的最快解决方案(与R的速度相当)是使用np.random.choice生成大量的卡牌抽取数组,然后应用Counter。我不喜欢不必要地创建数组的想法,因此我尝试使用字典和for循环,一次抽取一张牌并增加该类型牌的计数。令我惊讶的是,它慢得多!
下面是我测试的三种方法的完整代码。有没有一种方法可以像method1()一样高效,但使用恒定空间? Python代码:(Google Colab链接)
我想找到一种使用恒定空间的快速蒙特卡罗模拟方法。
下面的问题很简单,但可以作为不同方法的良好测试:
ex 4.3
确定从洗牌后的pinochle牌组中抽取一个10的确切概率。 (在pinochle牌组中,有48张牌。有六个值:9、10、Jack、Queen、King、Ace。每个标准的四种花色:红心,方块,梅花,黑桃中都有两个相同的值。)
(A)获取10的概率是多少?
当然,答案是1/6。
我能找到的最快解决方案(与R的速度相当)是使用np.random.choice生成大量的卡牌抽取数组,然后应用Counter。我不喜欢不必要地创建数组的想法,因此我尝试使用字典和for循环,一次抽取一张牌并增加该类型牌的计数。令我惊讶的是,它慢得多!
下面是我测试的三种方法的完整代码。有没有一种方法可以像method1()一样高效,但使用恒定空间? Python代码:(Google Colab链接)
deck = [c for c in ['9','10','Jack','Queen','King','Ace'] for _ in range(8)]
num_draws = 1000000
def method1():
draws = np.random.choice(deck, size=num_draws, replace=True)
df = pd.DataFrame([Counter(draws)])/num_draws
print(df)
def method2():
card_counts = defaultdict(int)
for _ in range(num_draws):
card_counts[np.random.choice(deck, replace=True)] += 1
df = pd.DataFrame([card_counts])/num_draws
print(df)
def method3():
card_counts = defaultdict(int)
for _ in range(num_draws):
card_counts[deck[random.randint(0, len(deck)-1)]] += 1
df = pd.DataFrame([card_counts])/num_draws
print(df)
Python timeit() 结果:
方法1: 1.2997
方法2: 23.0626
方法3: 5.5859
R 代码:
card = sample(deck, numDraws, replace=TRUE)
print(as.data.frame(table(card)/numDraws))
num_draws = 1000000```
- Jules Kuehnnumpy
中创建大数组是一项功能,而不是错误。 - hpaulj