J'ai réfléchi à une évaluation rapide des mains de poker en Python. J'ai pensé qu'une façon d'accélérer le processus serait de représenter toutes les faces et couleurs des cartes sous forme de nombres premiers et de les multiplier ensemble pour représenter les mains. À la rigueur :
class PokerCard:
faces = '23456789TJQKA'
suits = 'cdhs'
facePrimes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 53, 59, 61]
suitPrimes = [2, 3, 5, 7]
Y
def HashVal(self):
return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit]
Cela donnerait à chaque main une valeur numérique qui, par modulo, pourrait me dire combien de rois sont dans la main ou combien de cœurs. Par exemple, toute main contenant cinq trèfles ou plus serait divisée de façon égale par 2^5 ; toute main contenant quatre rois serait divisée de façon égale par 59^4, etc.
Le problème est qu'une main de sept cartes comme AcAdAhAsKdKhKs a une valeur de hachage d'environ 62,7 quadrillions, ce qui nécessiterait considérablement plus que 32 bits pour la représenter en interne. Existe-t-il un moyen de stocker de si grands nombres en Python qui me permette d'y effectuer des opérations arithmétiques ?
19 votes
Êtes-vous sûr qu'une fois que vous aurez commencé à représenter vos données de cette manière, vous verrez toujours une amélioration significative de la vitesse ? Je réalise que cela ne répond pas à vos questions, mais quand même
3 votes
J'ai une suggestion : au lieu d'utiliser des variables séparées pour les valeurs des cartes et les représentations, je suggère d'utiliser des dictionnaires. (Ainsi faces = {'2' : 11, '3' : 13, '4' : 17, '5' : 19, '6' : 23, '7' : 29, '8' : 31, '9' : 37, 'T' : 41, 'J' : 43, 'Q' : 53, 'K' : 59, 'A' : 61} et combinaisons = {'c' : 2, 'd' : 3, 'h' : 5, 's' : 7}.)
0 votes
S'appuyer sur la multiplication et la factorisation des entiers semble être une énorme perte de vitesse, et non un gain. Il y aurait probablement aussi une perte de mémoire. Si vous voulez vraiment optimiser le stockage des mains, vous pourriez envisager d'utiliser un champ de bits avec 3 bits par rang (parce que vous pouvez avoir entre 0 et 4 cartes de chaque rang) et 4 bits par couleur. Mais je ne suis pas sûr que Python soit le meilleur langage pour ce genre d'optimisations. Peut-être qu'en utilisant un
collections.Counter
à la place serait plus simple.