Python给出了内存错误

时间:2014-08-06 13:04:27

标签: python memory out-of-memory

大家好我对python.i很新,试图从网上编码网站解决这个问题

A = 3,B = 5
表A = 3,6,9,12,15,18等 表B = 5,10,15,20等等 合并后:3,5,6,9,10,12,15,15,18,20等等 删除重复项:3,5,6,9,10,12,15,18,20等等 对于N = 2,超级表面的第二元素是5

问题是我可以得到有限范围的A和B的答案但是当我为10 ^ 9元素执行时我得到了内存错误。

from array import *
import itertools
array1=[]
array2=[]
A=int(input())
B=int(input())
N=int(input())
for i in range(0,10**9):
    try:
        array1.append(i+1 * A)
    except MemoryError :
        break 

for j in range(0,10**9):
    try:
        array2.append(j+1 * B)
    except MemoryError :
        break
filter(None ,array1)
filter(None ,array2)
array3 = array1 + array2
array3 = sorted(set(array3))
print (array3[N])

追踪(最近的呼叫最后):
  文件“C:/ Users / Clinton D / Desktop / supertables.py”,第21行,中     array3 = array1 + array2 的MemoryError

3 个答案:

答案 0 :(得分:2)

如果您确实需要使用此大型数据集,则应使用pandasnumpy来处理它。

但如果您正在尝试解决编码高尔夫问题,请尝试使用较小的数据集来测试您的方法。无论如何,您可以考虑使用迭代器而不是列表,并使用iterator.chain来连接迭代器。

from itertools import chain

A=int(input())
B=int(input())
N=int(input())

array_a = (i*A for i in range(10**4))
array_b = (i*B for i in range(10**4))
array_c = chain(array_a, array_b)
c = sorted(set(array_c))

print(c[N])

答案 1 :(得分:0)

正如已经指出的那样,你在内存中制作了一些非常大的列表。我还发现你真的期待MemoryError令人惊讶!您的问题的一部分将通过使用列表推导来解决,这些是告诉Python如何构建列表而不必使用for循环和追加的方法。例如,前100个数字的平方的列表理解可以写为:

squares = [x*x for x in xrange(100)]

列表推导由两部分组成:元素定义和应用它的可迭代集。在前面的示例中,x * x是元素定义,xrange(100)中的x是可迭代部分。

现在回到你的问题。从你的代码中得到的第二件事是使用数组模块,而不需要任何特殊内容。

最后,使用filter(None,[...])可以消除每个求值为False的元素,对于数字为0,在你的例子中,任何列表中都没有这样的元素,除非A或B为0。

所以你的脚本应该按照以下方式结束:

A = int(input())
B = int(input())
N = int(input())

array1 = []
array2 = []
if A:
    array1 = [i * A for i in xrange(1, 10**7 + 1)]
if B:
    array2 = [i * B for i in xrange(1, 10**7 + 1)]

array1.extend(array2)
del(array2)  # not entirely necessary, if you have 128GB RAM or more...
array1 = sorted(set(array1))
print array1[N-1]

在我脑海中出现的一些事情,直到我完成了我的计算机测试你的代码,是你可以使用生成器来解决这个问题。我现在完全确定了。另外,为什么你想要一到二十亿个元素?

我认为你的问题不是与Python或内存不足有关的东西,而是计算这些值的可怕算法 - 我只是稍微不那么糟糕。

修改

  • @acushner注意到方块列表只是命名列表,可能会干扰内置的Python列表。
  • 这里和那里有一些拼写错误。
  • 我发布了一个稍微不正确的脚本版本,现在修复了。

答案 2 :(得分:0)

您不想提前创建整个列表(例如,如果您只想找到第N个值,为什么要创建所有这些值?)

你想要做的是这样的事情:

def f(n):
    vals = (x for x in xrange(1, 10**9) if (x % 3 == 0) or (x % 5 == 0))
    for _ in xrange(n - 1):
        vals.next()
    return vals.next()

你只是在这里迭代,所以没有大的列表创建。