在Python中提供安全的测试值

时间:2013-05-24 11:19:27

标签: python

  • Python编程中是否使用了一种方法来决定安全测试值?要确保意外的大值不会导致风险。
  • 我读过Python不鼓励进行类型检查。在这种情况下是否应该进行类型检查或限制检查?还是有替代方案?


我正在使用此代码并测试运行时间。我不小心输入了一个非常大的数字并运行了代码。我已经能够通过任务管理器停止它,当它已经达到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

4 个答案:

答案 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的更多示例。替代方案包括Nosepy.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

有关主要确定算法的更多信息,请查看:

  

http://en.wikipedia.org/wiki/Primality_test

     

Which is the fastest algorithm to find prime numbers?