【问题标题】:Python - memory efficiency - rangePython - 内存效率 - 范围
【发布时间】:2017-10-05 16:36:42
【问题描述】:

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

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

MaxPower() 仅在 i 除以 N_remainder 时在 factorise() 函数中调用

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

  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. 使用线程并确保在使用后删除每个线程。

【问题讨论】:

  • 你知道代码的哪一部分正在使用所有的内存吗?当可能只有一小部分实际存在问题时,需要执行大量代码。
  • 我不确定,但我怀疑它可能是maxpower() 函数。一个例子是第三个例子 (1*10^9) - 这个手动分解为 2^9 * 5^9 - 这可能与在内存中存储大量数字有关吗?
  • 更新了MaxPower()函数代码最少的问题
  • 这个函数应该做什么?
  • 只是让您知道:看起来其中一些数字的大小也可能非常大。 sys.getsizeof() 报告 10**8 本身占用 16 个字节,2**(10**8) 占用 13333346 个字节。

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


【解决方案1】:

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

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

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


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

【讨论】:

  • xrange 的存在时间比 Python 3 长得多。它甚至比 Python 2 的存在时间更长;它在Python 1.4 docs 中列出。
  • @user2357112 哦,我还以为是反向移植。我现在正在纠正它。
猜你喜欢
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多