Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中查找第一个百万自然数的乘积_Python_Python 3.x_List_Function_Out Of Memory - Fatal编程技术网

在Python中查找第一个百万自然数的乘积

在Python中查找第一个百万自然数的乘积,python,python-3.x,list,function,out-of-memory,Python,Python 3.x,List,Function,Out Of Memory,我刚刚开始学习Python编程语言。我试着写一个函数,输入一个列表或多个整数来找到它们的乘积。我试图找到第一个一百万个自然数的乘积,但它显示了一个MemoryError def product(*arg): answer=1 if type(arg) == tuple: arg=str(arg) arg=arg.lstrip('[(') arg=arg.rstrip('],)') arg=arg.split(',')

我刚刚开始学习Python编程语言。我试着写一个函数,输入一个列表或多个整数来找到它们的乘积。我试图找到第一个一百万个自然数的乘积,但它显示了一个
MemoryError

def product(*arg):
    answer=1
    if type(arg) == tuple:
        arg=str(arg)
        arg=arg.lstrip('[(')
        arg=arg.rstrip('],)')
        arg=arg.split(',')
        for i in arg:
            answer*=int(i)
        return answer
    else:
        for i in arg:
            answer*=int(i)
        return answer

j=range(1,1000000,1)
j=list(j)
print(product(j))
步骤:

  • 如果要传递列表,则将范围对象转换为列表对象 论据
  • 现在,在函数中,我尝试通过转换元组来拆分元组 绳子
  • 我将结果字符串转换为一个列表,然后在 元素来查找产品
Q1:当我试图找到前百万个自然数的乘积时,如何避免内存错误


Q2如何改进此代码?

要计算100万到100万之间所有数字的乘积,请使用一个简单的循环:

r = 1
for l in range(1,1000000):
    r*=(i+1)
print(res)
但请记住,结果将是一个相当大的数字。 这意味着您的计算可能需要很长时间,结果数字将需要大量内存

编辑然后我有点误读了你的问题。这是一个将列表中的元素相乘的函数:

def multiply_list_elements(_list):
    result = 1
    for element in _list:
        result*=element
    return result

multiply_list_elements([1,2,3,4])

>>> 24

内存错误可能来自于@ZabirAlNazi计算得很好的巨大数字。

要计算100万到100万之间所有数字的乘积,请使用一个简单的循环:

r = 1
for l in range(1,1000000):
    r*=(i+1)
print(res)
但请记住,结果将是一个相当大的数字。 这意味着您的计算可能需要很长时间,结果数字将需要大量内存

编辑然后我有点误读了你的问题。这是一个将列表中的元素相乘的函数:

def multiply_list_elements(_list):
    result = 1
    for element in _list:
        result*=element
    return result

multiply_list_elements([1,2,3,4])

>>> 24
内存错误可能来自于@ZabirAlNazi计算得非常好的巨大数字。

您可以在Python中使用

def generate_product():
    r = 1
    for i in range(1,1000000):
        r *= i + 1
        yield r

list(generate_product())[0]
它的内存效率更高,性能也更好

您可以在Python中使用

def generate_product():
    r = 1
    for i in range(1,1000000):
        r *= i + 1
        yield r

list(generate_product())[0]

它的内存效率更高,性能也更好

所有的解决方案都很好,但有一点需要说明——你的问题相当于找到一百万的阶乘

n的位数!=log10(1)+log10(2)+。。。日志10(n)

因此,您的答案中的位数是
5565703
(大约)

这只是最后的
n
,如果您还需要中间结果,则需要平方内存O(m^2)


注意:你可以用对数和斯特林数进行近似运算,运算速度更快。

所有的解决方案都很好,但有一点需要说明——你的问题相当于找到一百万的阶乘

n的位数!=log10(1)+log10(2)+。。。日志10(n)

因此,您的答案中的位数是
5565703
(大约)

这只是最后的
n
,如果您还需要中间结果,则需要平方内存O(m^2)


注意:您可以使用对数和斯特林数进行近似计算,运行速度更快。

一个非常简单的解决方案是:

    def prod_of():
        p=1
        for i in range(1,1000000):
            p* = i
        print(p)

一个非常简单的解决方案是:

    def prod_of():
        p=1
        for i in range(1,1000000):
            p* = i
        print(p)

究竟为什么要将元组转换为字符串并返回,而不是像else语句中那样直接迭代?当我传递arg参数时,它会转换为一个元素化的元组。因此,我无法迭代它。请尝试
for i in arg[0]:
谢谢,
arg[0]
的工作方式使我可以直接在其上循环。但是关于寻找百万数字乘积的问题仍然存在。对于较小的数字:
math.factorial(1000)
reduce(mul,range(11000+1))
)但是对于
1000\u 000
来说,答案太大了:你可能会问,你到底为什么要将元组转换成字符串并返回,而不是像在else语句中那样直接迭代呢?当我传递arg参数时,它会被转换成单个元素元组。因此,我无法迭代它。请尝试
在arg[0]中输入i:
然后谢谢,
arg[0]
的工作方式是我可以直接在它上面循环。但是寻找百万数字乘积的问题仍然存在。对于较小的数字:
math.factorial(1000)
reduce(mul,range(1,1000+1))
)但是对于
1000\u 000
,答案太大了:谢谢。但是我试图创建一个函数,在这个函数中,我输入任何数字列表,然后得到产品。我提到了前一百万个数字,因为在测试我的函数时,它显示了一个内存错误。谢谢。但是我试图创建一个函数,在这个函数中,我输入任何数字列表,然后得到产品。我提到了前一百万个数字,因为在测试我的函数时,它显示了一个内存错误。