在Python中处理非常大的数字

时间:2009-02-11 20:13:46

标签: python optimization largenumber

我一直在考虑用Python进行快速扑克手牌评估。在我看来,加速这个过程的一种方法是将所有卡面和套装表示为素数,然后将它们相乘以代表手。致白:

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]

    def HashVal(self):
      return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit]

这会给每只手一个数值,通过模数可以告诉我手中有多少国王或多少颗心。例如,任何有五个或更多球杆的手将平均分为2 ^ 5;任何有四个国王的手都会平均分为59 ^ 4等。

问题在于像AcAdAhAsKdKhKs这样的七张牌的哈希值大约为62.7千万亿,在内部表示需要大于32位。有没有办法在Python中存储这么大的数字,这将允许我对它进行算术运算?

5 个答案:

答案 0 :(得分:148)

Python支持“bignum”整数类型,可以使用任意大数。在Python 2.5+中,此类型称为long,与int类型分开,但解释器将自动使用更合适的类型。在Python 3.0+中,int类型已完全删除。

这只是一个实现细节 - 只要你有2.5或更高版本,只需执行标准的数学运算,任何超过32位数学边界的数字都将自动(并透明地)转换为bignum。

您可以在PEP 0237找到所有血腥的详细信息。

答案 1 :(得分:49)

python自然支持 任意 大型 整数

示例:

  

>>> 10 ** 1000 100000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000000000000000000000   00000000000000000000000000000000000000000000000000000000000000000

你甚至可以获得一个巨大的整数值fib(4000000)。

但它仍然(现在)支持任意大的浮动 !!

如果你需要一个大的,大的浮动,那么检查十进制模块。这些foruns有一些使用示例:OverflowError: (34, 'Result too large')

另一个参考:http://docs.python.org/2/library/decimal.html

如果您需要加速(这可能是您感兴趣的话),您甚至可以使用gmpy模块:Handling big numbers in code

另一个参考:https://code.google.com/p/gmpy/

答案 2 :(得分:28)

你可以这样做,但除此之外,这不是一个好主意。它不会加速我能想到的任何事情。

  • 获取牌将是一个整数因子分解操作,比访问阵列要昂贵得多。

  • 添加卡片会成倍增加,并移除卡片部门,这两个都是大型多字数字,这比在列表中添加或删除元素的操作更加昂贵。

  • 手的实际数值不会告诉您任何信息。您将需要考虑素数并遵循扑克规则来比较两手牌。 h1< h2对于这样的手意味着什么。

答案 3 :(得分:22)

python自然支持任意大整数:

In [1]: 59**3*61**4*2*3*5*7*3*5*7
Out[1]: 62702371781194950
In [2]: _ % 61**4
Out[2]: 0

答案 4 :(得分:1)

python解释器将为您处理它,您只需执行操作(+,-,*,/),它便会正常工作。

int的值是无限的。

小心除法,默认情况下商会变成float,但是float不支持这么大的数。如果您收到一条错误消息,指出float不支持这么大的数字,则表示该商太大而无法存储在float中,则必须使用下限除法(// )。

它将忽略小数点后的任何小数,这样结果将为int,因此可以得到较大的结果。

10//3输出3

10//4输出2