簡體   English   中英

n ** n ** n啟發式Python

[英]n**n**n heuristics in Python

我只是玩Python並發現了一件有趣的事情:我的電腦(i5,3 GHz)在試圖計算10 ** 10 ** 10幾個小時后才掛出。 我知道Math不是為Python創建的目的,但我想知道是不是有辦法幫助Python計算它。

到目前為止我所觀察到的是: n ** (2** lg(n**n))n ** n ** n快2倍

n = 8 ** (8 ** 8)
n2 = 8 ** (2 ** 24)
# measured by timeit
> 4.449993866728619e-07
> 1.8300124793313444e-07

1)有沒有人知道如何以最復雜的方式解決n ** n ** n

2)生成器可以幫助減少內存濫用嗎?

10 ** 10 ** 10是一個非常大的數字 Python正在嘗試分配足夠的內存來表示該數字。 10.000.000.000(100億)位數比計算機一次性提供的內存要多得多,因此您的計算機現在將內存交換到磁盤以騰出空間,這就是為什么現在的速度非常慢。

為了說明,嘗試在一些適合的數字上使用sys.getsizeof()

>>> import sys
>>> sys.getsizeof(10 ** 10 ** 6)
442948
>>> sys.getsizeof(10 ** 10 ** 7)
4429264

所以額外的數字需要大約 10倍的內存。 以上金額以字節為單位,因此100萬位數字幾乎占用半兆字節,1000萬位數字占4兆字節。 在Extrapoliting中,您的號碼需要4 GB的內存。 這取決於你的操作系統和硬件,如果Python甚至會給予那么多的內存。

Python在現代平台上以30位的增量存儲整數; 所以每30位需要額外的4個字節的存儲空間。 對於100億個數字(log2(10 ** 10 ** 10) / 30 * 4) / (1024 ** 3) ==約4.125GiB。

你不能使用Python來表示這么大的數字。 甚至浮點數也不會達到那么高:

>>> 10.0 ** 10 ** 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')

我對Python中的bignum(大數字)處理並不熟悉; 也許gmpy libray有能力代表更好的數字。

如果整數精度不是最重要的,則可以使用float

>>> 3**3**3
7625597484987
>>> 3.**3.**3.
7625597484987.0

但是,對於較大的值,這些將很快達到其極限:

>>> 5.**5.**5.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: (34, 'Numerical result out of range')

decimal可以得到更高的值:

>>> import decimal
>>> d = decimal.Decimal
>>> d(5)**d(5)**d(5)
Decimal('1.911012597945477520356404560E+2184')
>>> d(10)**d(10)**d(8)
Decimal('1.000000000000000000000000000E+100000000')

默認情況下,即使是那些也不能代表10**10**10

>>> d(10)**d(10)**d(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/decimal.py", line 2386, in __pow__
    ans = ans._fix(context)
  File "/usr/lib/python2.7/decimal.py", line 1676, in _fix
    ans = context._raise_error(Overflow, 'above Emax', self._sign)
  File "/usr/lib/python2.7/decimal.py", line 3872, in _raise_error
    raise error(explanation)
decimal.Overflow: above Emax

但這些限制並不固定。 使用getcontext()可以使它們盡可能大:

>>> decimal.getcontext().Emax = 1000000000000
>>> d(10)**d(10)**d(10)
Decimal('1.000000000000000000000000000E+10000000000')

但請記住,這些數字並不是最后一位數字的100%精確度(您的計算機可能甚至沒有足夠的內存來存儲每個數字),所以如果發生這種情況,請不要感到驚訝:

>>> d(10)**d(10)**d(10) == d(10)**d(10)**d(10) + 1000000
True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM