热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python程序运行无响应:为何在我的计算机上执行时会变慢且无任何反馈?

在Python编程中,当遇到程序运行无响应的问题时,通常与计算资源的消耗有关。Python使用任意精度整数进行计算,这意味着在处理大数值运算时,如计算大指数值,系统可能会因为内存或CPU资源不足而变得缓慢,甚至没有反馈。此外,代码中的无限循环或递归调用也可能导致类似问题。建议检查代码逻辑,优化算法效率,并确保计算任务不会超出系统的处理能力。

在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}$

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



推荐阅读
author-avatar
搭配课彡堂-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有