Python - 内存效率 - 范围

Python - memory efficiency - range

我正在寻找方法来使 MaxPower() 功能的以下最小代码更有效地使用我的代码和示例。

MaxPower() 的用途:对于整数 iN_remainder,到 return m 的最大值使得 i^mN_remainder

MaxPower() 仅在 factorise() 函数中调用,如果 iN_remainder

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

  1. 1x10^8 - 工作正常。产生了两个结果数组并且是正确的
  2. 5x10^8 - 挂起 Linux & OS 完全没有反应。计算机需要硬重启。
  3. 1x10^9 - 在终端中给出内存错误。

Python 使用的版本是 Linux Mint 17 上的 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. 使用线程并确保每个线程在使用后都被删除。

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

取而代之的是 xrange 函数,它的作用几乎相同。这使用常量内存,仅存储参数并仅在需要时计算每个值,并且在使用后不存储旧值。如果您将对 range 的调用替换为对 xrange 的调用,您的函数应该使用几乎恒定的内存。

请注意,如果 N_remainder + 1 对于 python int 来说太大了,xrange 函数将不起作用,但文档提供了替代方法。


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