为什么Python消耗那么大内存?

璀璨夜空 2020-12-17 09:46:03
刚学Python,写了一个简单的测试程序,发现Python消耗很大内存,计算过程中不释放内存。请问什么原因呢?

#!/usr/local/bin/env python

def is_prime(num):
if num <= 1: return False
if num != 2 and num % 2 == 0: return False

to = num / 2 + 1
for x in range(3, to, 2):
if num % x == 0: return False
return True

if __name__ == "__main__":
primes = []
for x in range(2, 100):
if is_prime(x): primes.append(x)
print(primes)

product = primes[0]
for i in range(1, len(primes)):
print("prime: " + str(primes[i]))
new_prime = product * primes[i] + 1
if is_prime(new_prime):
print("new prime: " + str(new_prime))
else:
print(str(new_prime) + " is not prime! [error]")
product *= primes[i]


...全文
1143 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Galaxy0204 2021-01-07
  • 打赏
  • 举报
回复
你这个程序写得很不对,你看看你生成的primes是100以内的所有素数,而new_prime最大可以达到primes里面所有素数的乘积,这个数很大,很明显都超过10的30次方了。然后你的is_prime(new_prime)里面有一个循环,这个循环是从3开始到new_prime/2间隔为2,这得循环10的30次方以上,估计你的电脑得跑几十亿年。
璀璨夜空 2021-01-07
  • 打赏
  • 举报
回复
引用 8 楼 ruancan 的回复:
跟语言无关,代码写的烂而已


我就是随便写写看看Python是怎么运作的。
璀璨夜空 2021-01-07
  • 打赏
  • 举报
回复
引用 9 楼 Galaxy0204 的回复:
你用的是Python2.7吧?python2.7的range()函数是会占用内存的,is_prime中的range(3, to, 2)函数会先生成一个大小等于to/2的数组,这个to大于new_prime的二分之一,所以这个数组很大。3.0以上python的range()函数不占用内存,是不会先生成数组的。2.7应该改用xrange。




是的,确实是python2的问题。python3就不会有内存泄露!谢谢🙏!终于得到解释了!~分数都给你了!
Galaxy0204 2021-01-07
  • 打赏
  • 举报
回复
你用的是Python2.7吧?python2.7的range()函数是会占用内存的,is_prime中的range(3, to, 2)函数会先生成一个大小等于to/2的数组,这个to大于new_prime的二分之一,所以这个数组很大。3.0以上python的range()函数不占用内存,是不会先生成数组的。2.7应该改用xrange。
ruancan 2021-01-07
  • 打赏
  • 举报
回复
跟语言无关,代码写的烂而已
璀璨夜空 2021-01-07
  • 打赏
  • 举报
回复
引用 6 楼 Galaxy0204 的回复:
python不会在脚本运行途中就释放脚本中的某个变量,python的所有变量都是全局变量。不过你写的这个程序,所有变量所占内存加一起也不超过10KB,应该就是程序没跑完导致你的spyder或者pycharm一直在占用内存。


不是的,你如果直接用Python运行一下就知道是Python解释器本身会一直消耗内存到几G,相当于内存泄露。我就很不理解这么个简单的程序怎么就造成内存泄露了。
Galaxy0204 2021-01-07
  • 打赏
  • 举报
回复
python不会在脚本运行途中就释放脚本中的某个变量,python的所有变量都是全局变量。不过你写的这个程序,所有变量所占内存加一起也不超过10KB,应该就是程序没跑完导致你的spyder或者pycharm一直在占用内存。
璀璨夜空 2021-01-07
  • 打赏
  • 举报
回复
引用 4 楼 Galaxy0204 的回复:
你这个程序写得很不对,你看看你生成的primes是100以内的所有素数,而new_prime最大可以达到primes里面所有素数的乘积,这个数很大,很明显都超过10的30次方了。然后你的is_prime(new_prime)里面有一个循环,这个循环是从3开始到new_prime/2间隔为2,这得循环10的30次方以上,估计你的电脑得跑几十亿年。


感谢你的回复,不过我写这个程序只是验证一个想法,先不管它正确与否,我的问题是为什么跑起来的时候会一直在消耗内存而不释放?其他语言不会出现这种问题。你可以尝试运行一下就知道我是什么意思了。难道Python写程序时有特别需要注意释放内存的地方吗?
璀璨夜空 2021-01-06
  • 打赏
  • 举报
回复
有大神讲解一下这段Python为什么会一直消耗内存而不释放内存呢?
璀璨夜空 2021-01-04
  • 打赏
  • 举报
回复
没有人可以解释一下吗?
cclxpp123 2021-01-04
  • 打赏
  • 举报
回复
试除效率太低, 建议使用
from sympy.ntheory.modular import isprime

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧