python中的扑克手评估:为什么naive比bit hash快?

2024-05-19 01:17:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个基于python的扑克程序。对于手动值的评估,我希望位哈希评估比简单评估(排序和测试不同的手动级别)快得多。然而,使用两个库,我实际上遇到了相反的情况。你知道吗

有没有人有过平分/树(python3平分之叉)的经验。 https://github.com/worldveil/deuces

这是一个仙人掌kev风格的散列工具,通过运行21(7选择5)个单独的5卡评估,暴力强迫7卡手。目前大约需要80秒来评估剩余牌的所有排列的两只手。即2只手*1712304块板*21个7张牌手或72毫米手来评估。你知道吗

因此,我实现了900000次评估/秒的速度,这似乎符合或优于预期。你知道吗

然而奇怪的是,当我使用Kevin Tseng的holdemèu calc(https://github.com/ktseng/holdem_calc)时,我在20秒内得到了相同比较的结果

它使用了一种简单的排序和手工测试方法——除了将卡片存储为对象,而不是用字节级数据打包的简单int。看来这个应该重多了。你知道吗

代码如下。我已经分析了它,以确认它是95%的时间使用的evaluate函数。你知道吗

为什么天真要快得多?这似乎与我迄今为止读到的一切都背道而驰。你知道吗

双数/树码(更改导入):

from deuces import Card, Deck, Evaluator
import itertools
import time

start = time.time()

evaluator = Evaluator()
deck = Deck()
p1_hand = deck.draw(2)
p2_hand = deck.draw(2)
hands = [p1_hand, p2_hand]

print(Card.print_pretty_cards(p1_hand))
print(Card.print_pretty_cards(p2_hand))

boards = [i for i in itertools.combinations(deck.cards, 5)]

p1_wins = 0
p1_ties = 0
for b in boards:
    p1_score = evaluator.evaluate(p1_hand, list(b))
    p2_score = evaluator.evaluate(p2_hand, list(b))
    if p1_score < p2_score:
        p1_wins += 1
    elif p1_score == p2_score:
        p1_ties += 1

print(float(p1_wins / len(boards)))
print(time.time() - start)

holdem\u计算代码(也可以作为CLI运行):

from holdem_calc import main
import sys
import time

sys.argv.extend(['As', '8d', 'Qc', '9c'])
sys.argv.extend(['--exact'])
start = time.time()
main()
print "\nTime elapsed(seconds): ", time.time() - start

Tags: importtimeevaluatorcalccardstartcardsscore

热门问题