• 全部
  • 互动交流
  • 文章分享

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

璀璨夜空 iOS 程序员  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]


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


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


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


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

3.7w+

社区成员

JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
申请成为版主
帖子事件
创建了帖子
2020-12-17 09:46
社区公告

CSDN 脚本语言社区接受专栏投稿(专栏会在顶部创建专属你的栏目),投稿需满足以下要求:

  • 脚本语言技术相关;
  • 文章持续更新,保持活跃;
  • 内容清晰明了,干货为主;
  • 文章排版有序,有条有理。

本社区开通招聘专栏,发布招聘信息请联系版主,发布者需要保证招聘信息真实有效,CSDN 平台和版主不对招聘内容负责!

联系方式:私聊版主、发送邮件、QQ联系等均可: