-4

我正在寻找MaxPower()使用我的代码使以下函数的最小代码更有效的内存和示例的方法。

用途MaxPower():对于整数i和,返回除以N_remainder的最大值。mi^mN_remainder

MaxPower()仅在除法时在factorise()函数中调用iN_remainder

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

  1. 1x10^8 - 工作正常。产生了两个结果数组并且是正确的
  2. 5x10^8 - 挂起 Linux 和操作系统完全没有响应。电脑需要硬重启。
  3. 1x10^9 - 在终端出现内存错误。

在 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 代码中做更多的工作 - 转换为“列表理解”
  2. 使用线程并确保在使用后删除每个线程。
4

1 回答 1

2

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

相反,有一个xrange函数,它几乎做同样的事情。这使用常量内存,仅存储参数并仅在需要时计算每个值,并且在使用旧值后不存储它们。如果您将调用替换为调用range,则xrange您的函数应该使用几乎恒定的内存。

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


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

于 2017-10-05T17:25:53.387 回答