在Python里面怎么可以运算出999999999**999999999?我们测试一下
思考下:在Python里面怎么可以运算出999999999**999999999呢?
>>> 999999999 * math.log(999999999, 2) / 8 / 1024 ** 3 3.480509950621777
经过计算,我们可以发现数字本身就差不多需要3.5GB内存,考虑到计算过程中需要存储临时结果,还需要翻个两三倍吧
而Python中的long可以到多少呢:
#define MAX_LONG_DIGITS \ ((PY_SSIZE_T_MAX - offsetof(PyLongObject, ob_digit))/sizeof(digit))
offsetof算出来的是对象头大小,很小,digit是表示数字的每个“位”的字节数,其实就是这个数字存放的数组的元素大小,比如unsigned short,单纯看内存的话,可以大概到PY_SSIZE_T_MAX这个级别,这个数字是C的size_t的最大值除以二,若在64bit环境下,怎么看都够用了
但是呢,这个数字算出来只需要内存和时间就好,但是打印出来就是另回事了,因为还要转为10进制,这时候光是算出来的字符串消耗的内存就是:
>>> 999999999 * math.log(999999999, 10) / 1024 ** 3 8.381903162752934
而且这个计算过程是非常慢的,数字转10进制需要O(N)次除法,每次O(N)。。。基本你是等不了的
当然,你也可以自己实现一个用10的幂的进制的形式存储的大数算法,不过用纯python搞这事,内存消耗也是很大的
补充:实际上,就算只是计算一下这个算式,也是很慢的,你可以自己试一下在命令行敲入:
a = 999999999 ** 999999999
只计算不输出,理论上如果你机器有个16G内存也是能算完的,但是,你打开win的任务管理器或者linux的top就可以看到,内存涨的其实还是蛮慢的,虽然Python在计算long的乘方用了快速幂(这个式子只需要几十次乘法),以及大数相乘用的那个O(N^1.58)的分治算法,但是数字比较大的时候后者还是非常慢的
[xt@mac: ~ $] time python -c 'a = 9999; a ** a' real 0m0.037s user 0m0.015s sys 0m0.018s [xt@mac: ~ $] time python -c 'a = 99999; a ** a' real 0m0.128s user 0m0.105s sys 0m0.019s [xt@mac: ~ $] time python -c 'a = 999999; a ** a' real 0m4.704s user 0m4.671s sys 0m0.028s [xt@mac: ~ $]
这个增长速度。。。大致就可以认为没法算出来吧
相关推荐
YENCSDN 2020-11-17
lsjweiyi 2020-11-17
houmenghu 2020-11-17
Erick 2020-11-17
HeyShHeyou 2020-11-17
以梦为马不负韶华 2020-10-20
lhtzbj 2020-11-17
夜斗不是神 2020-11-17
pythonjw 2020-11-17
dingwun 2020-11-16
lhxxhl 2020-11-16
坚持是一种品质 2020-11-16
染血白衣 2020-11-16
huavhuahua 2020-11-20
meylovezn 2020-11-20
逍遥友 2020-11-20
weiiron 2020-11-16