【问题标题】:How to optimize this code to reduce memory usage?如何优化此代码以减少内存使用?
【发布时间】:2018-03-30 21:46:53
【问题描述】:

我下面的代码使用大约(30000 个输入元素)使用超过 300000 KB 并且每个内存使用量有限制(256 MB),那么有什么办法可以优化它吗?

import itertools
def get_subsets(arr,m) :
    return list(itertools.combinations(arr,m))
def _9(string) :
    count =0
    for i in range(len(string)-1 , -1 ,-1) :
        if string[i] != '9' :
            break
        count += 1
    return count
if __name__ == "__main__" :
    length = int(input())
    arr = [int(x) for x in input().strip().split()]
    pairs = get_subsets(arr,2)
    max_9 = [_9(str(x[0]+x[1])) for x in pairs]
    max_9_0 = max(max_9)  
    print(max_9_0,max_9.count(max_9_0))

问题是: 让我们将价格的质量定义为其末尾的 9 的数量(等于 9 的最右边数字的数量)。例如,数字 2999 和 123912391999 的质量均为 3,而数字 952 的质量为 0。

有 n 个产品,价格不同 t1, t2, ..., tn。

您将购买两种产品(它们必须不同)。请找出两种所选产品的总价中可能的最高质量。另外,找出选择两种不同产品的方法的数量,并获得总价格的最大可能质量。

【问题讨论】:

  • 你可以从不实现你的组合迭代器开始......
  • 为什么在迭代器工作正常的情况下构建这么多列表?
  • 尝试将get_subsets() 函数更改为return itertools.combinations(arr,m),这将返回不同组合的(相对较小的)生成器,而不是包含所有组合的实际list
  • Python 本身对脚本可以运行多长时间没有时间限制,因此它必须是您用来运行产生该错误的代码的任何其他内容。无论如何,您现在可能需要弄清楚如何优化您的代码以更快地运行,因为它现在没有使用太多内存。要考虑的另一件事是使用完全不同的算法——你的算法似乎是一种非常“蛮力”的方法。
  • 分析您的脚本可能有助于了解其大部分时间都花在了哪些地方 — 了解将自己的时间花在哪里进行优化。见How can you profile a script?

标签: python memory optimization


【解决方案1】:

一种方法可能是不使用列表。使用生成器。它们也是可迭代的。见:http://letstalkdata.com/2015/05/how-to-use-python-generators-to-save-memory/

【讨论】:

    猜你喜欢
    • 2019-12-14
    • 2021-03-19
    • 2019-04-20
    • 2015-03-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多