【发布时间】: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