python程序运行后没有反应_为什么我的电脑在运行这个python程序时速度变慢,没有反应?...

在Python中,通常整数世界中的计算是用任意大小来完成的。因此,这意味着,如果计算^{{cd1>},它不会使用32位整数或64位整数来计算,但它在Python-2.x中使用^{{cd2>},或者Python-3.x中的^{cd3>}(但是Python-3.x中的^{cd3>})具有任意大小。

^{cd1>}是一个巨大的数字。它需要1000'000位,或者至少125'000字节。它还将使用一个算法计算功率,并必须表示中间结果。

在CPython中,存储值需要133 MB内存。但这并不是结束。现在,您想将其转换为字符串。字符串将取大约301'029'995位数字。每个数字至少需要一个字节。因此,这将需要额外的301 MB内存,而且需要大量的工作来计算十进制表示:每次迭代,我们必须执行一个模10检查,而且我们需要将数字除以10,所以它在数字的位数中工作(至少)二次。由于数字的数量巨大(约3亿),因此需要大量的工作。

^{cd6>}操作并不非常昂贵,但是以上步骤在内存(以及CPU时间中的somwhat,特别是转换为字符串)都很昂贵。内存似乎是我们可以忽略的一个因素,但是如果我们消耗了大量内存,系统会减慢速度,甚至冻结。通常,如果系统内存耗尽,它将开始使用swap内存:它将RAM内存的部分交换到硬盘驱动器,这是非常慢的(与RAM内存相比)。

上面的素描方式,获得数字的数量肯定不是一个好的方法。例如,它也不能与负数一起工作。有一个叫做对数的数学概念,如果您取一个数字的log10则得到数字数减去one。这里还有一些额外的问题:负数的^{cd7>}为未定义;以及

零的^{cd7>}也不是。

但我们可以解决这些问题。例如,通过构造函数:from math import log10, floor

def number_of_digits(x):

if x == 0:

return 1

else:

return 1 + floor(log10(abs(x)))

这将适用于所有整数值。如果您想计算电源的位数,我们甚至可以首先阻止计算^{cd1>}:

^{pr2}$

因此,数字的数量为:

^{pr3}$

这在速度和内存方面都有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值