Python - 内存效率 - 范围

时间:2017-10-05 16:36:43

标签: python python-2.7 range memory-efficient xrange

我正在寻找方法为MaxPower()功能提供以下最小代码,以提高内存效率。使用我的代码的例子。

MaxPower()的目的:对于整数iN_remainder,返回m的最大值,使i^m除以N_remainder

仅当MaxPower()factorise()

时才会在i函数中调用

N_remainder

目前,下面的链接代码对于要分解的数字具有以下结果(以标准格式书写):

  1. 1x10 ^ 8 - 工作正常。生成两个结果数组并且是正确的
  2. 5x10 ^ 8 - 挂起Linux&操作系统完全没有反应。计算机需要重启。
  3. 1x10 ^ 9 - 在终端中出现内存错误。
  4. 在Linux Mint 17上使用的Python版本是2.74。

    我正在学习python。

    def MaxPower(i,N_remainder):
        m=1
        MxP=1
        for n in range (2, N_remainder + 1):        
            b = i**n    
            a = N_remainder % b
            if a==0:    
                m = m+1                 
            else: 
                MxP = m     
                break
        return MxP
    

    自最初发布以来的修订代码:

    def MaxPower(i,N_remainder):
        m=1
        MxP=1
        for n in xrange (2, N_remainder + 1):       
            b = pow(i,n)        
            a = N_remainder % b
            if a==0:    
                m = m+1                 
            else: 
                MxP = m     
                break
        return MxP
    

    我知道以下情况(我现在没有尝试过新的和我目前的深度);

    1. 可以在编译的C代码中做更多工作 - 转换为“list comprehension”
    2. 使用线程&确保在使用后删除每个帖子。

1 个答案:

答案 0 :(得分:2)

Python 2 range function创建一个列表,其中包含给定范围内每个数字的一​​个条目。整个列表需要存储在内存中,因此对于N_remainder的大值,它可能会变得非常大。

相反,有xrange函数,它几乎完全相同。这使用常量存储器,仅存储参数并仅在需要时计算每个值,并且一旦使用它们就不存储旧值。如果您通过调用range替换对xrange的调用,则您的函数应使用几乎常量的内存。

请注意,如果N_remainder + 1对于python int而言太大,则xrange函数将无效,但文档提供了另一种选择。

不是内存问题,但您不需要显式调用long;必要时,Python 2会自动转换为long类型。