如何改进我的代码以避免基于内存的错误?
How can I improve my code to avoid memory based error?
我写了一个python函数largestProduct(n)
,它returns是两个n位数字乘积的最大数字。该代码在 n
之前运行良好,直到 3,但显示 n>3
的内存错误。有什么方法可以改进我的代码来避免这个错误吗?
def largestProduct(n):
number_lst = []
prod_lst = []
count = 0
for i in range(10**(n-1),(10**n)):
number_lst.append(i)
while count!= len(number_lst):
for i in range(len(number_lst)):
prod_lst.append(number_lst[count]*number_lst[i])
count +=1
prod_set = list(set(prod_lst))
return max(prod_lst)
您应该考虑创建一个生成器函数。最后,您可以迭代函数的输出,该函数只逐一处理每个元素,而不是将整个列表保存在内存中。
好吧,您不需要任何存储来遍历您需要的内容:
def largestProduct(n):
range_low = 10**(n-1)
range_high = 10**n
largest = 0
# replace xrange with range for Python 3.x
for i in xrange(range_low, range_high):
for j in xrange(range_low, range_high):
largest = max(largest, i*j)
return largest
但是你为什么要这样做?两个 n 长数字的最大乘积始终是您可以用 n 数字平方写出的最大数字,即:
def largestProduct(n):
return (10**n-1)**2
我写了一个python函数largestProduct(n)
,它returns是两个n位数字乘积的最大数字。该代码在 n
之前运行良好,直到 3,但显示 n>3
的内存错误。有什么方法可以改进我的代码来避免这个错误吗?
def largestProduct(n):
number_lst = []
prod_lst = []
count = 0
for i in range(10**(n-1),(10**n)):
number_lst.append(i)
while count!= len(number_lst):
for i in range(len(number_lst)):
prod_lst.append(number_lst[count]*number_lst[i])
count +=1
prod_set = list(set(prod_lst))
return max(prod_lst)
您应该考虑创建一个生成器函数。最后,您可以迭代函数的输出,该函数只逐一处理每个元素,而不是将整个列表保存在内存中。
好吧,您不需要任何存储来遍历您需要的内容:
def largestProduct(n):
range_low = 10**(n-1)
range_high = 10**n
largest = 0
# replace xrange with range for Python 3.x
for i in xrange(range_low, range_high):
for j in xrange(range_low, range_high):
largest = max(largest, i*j)
return largest
但是你为什么要这样做?两个 n 长数字的最大乘积始终是您可以用 n 数字平方写出的最大数字,即:
def largestProduct(n):
return (10**n-1)**2