我正在使用此代码并测试运行时间。我不小心输入了一个非常大的数字并运行了代码。我已经能够通过任务管理器停止它,当它已经达到850MB RAM使用率并且上升时。我不希望这样的事情再次发生。
def primes_list(num):
ans = [2]
for i in range(3, num, 2):
temp = False
for j in ans:
if i % j == 0 or j*j > i:
temp = True
break
if temp == False:
ans.append(i)
else:
return ans
答案 0 :(得分:1)
如果num是一个非常大的数字,你最好使用 xrange 而不是范围。所以改变这一行
for i in range(3, num, 2):
到
for i in xrange(3, num, 2):
这将为您节省大量内存,因为范围会在内存中预先分配列表。当num非常大时,列表将占用大量内存。
如果你想限制内存使用量,只需在执行任何操作之前检查num。
答案 1 :(得分:1)
在linux bash上有一个功能ulimit
,它可以为运行的任何进程提供内存限制。将其添加到您的程序中,并将print num
作为primes_list函数的第一行
try:
primes_list(10)
primes_list(100)
primes_list(1000)
primes_list(10000)
primes_list(100000)
primes_list(1000000)
primes_list(10000000)
primes_list(100000000)
except MemoryError:
print "out of memory"
然后你应该能够在shell中看到以下功能。请注意,我启动了一个新的bash shell。结束shell将使ulimit恢复正常。当然可以编写脚本。在这个例子中,我将虚拟内存大小限制为100MB
$ bash
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63064
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63064
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
$ ulimit -v 100000
$ python foo.py
10
100
1000
10000
100000
1000000
10000000
out of memory
答案 2 :(得分:1)
您确切的问题是在命令行测试函数时键入的值太大。这里的解决方案不是以任何方式修改函数,而是使用自动化测试。
最简单的自动化测试只意味着编写另一个调用函数的函数,并确保它返回正确的值。计算机完全按照您在命令行中执行的操作完成。但是,自动化方法更好,因为您的测试函数保存在文件中 - 您不需要每次都在命令提示符下键入测试值。因此,您基本上不会输入错误的数字并获得内存溢出。还有lots of other advantages。
Python的标准库包括the unittest
module,旨在帮助您组织和运行单元测试。 unittest
here的更多示例。替代方案包括Nose和py.test,两者都与unittest
交叉兼容。
primes_list
功能的示例:
import unittest
class TestPrimes(unittest.TestCase):
def test_primes_list(self):
pl = primes_list(11) # call the function being tested
wanted = [2,3,5,7,11] # the result we expect
self.AssertEqual(pl, wanted)
if __name__ == "__main__":
unittest.main()
为了证明自动化测试有效,我写了一个测试,由于你的函数中的错误而失败。 (提示:当提供的最大值为素数时,它将不包含在输出中)
答案 3 :(得分:0)
你不是要列出素数吗?不知道这对你有帮助,但仍然:
def primes(n): // n is the maximum number we want to check
if n==2: return [2] // 2 is the lowest prime number
elif n<2: return [] // there's no prime number below 2
s=range(3,n+1,2) // range from 2 by 2 numbers, leave out even numbers
mroot = n ** 0.5 // get's the root of maximum number
half=(n+1)/2-1
i=0
m=3
while m <= mroot: // no point in checking above the root of the highest number
if s[i]:
j=(m*m-3)/2
s[j]=0
while j<half:
s[j]=0
j+=m
i=i+1
m=2*i+3
return [2]+[x for x in s if x] // final array consists of 2 and the rest of primes
有关主要确定算法的更多信息,请查看: