【问题标题】:Finding the product of first Million natural numbers in Python在 Python 中查找前百万个自然数的乘积
【发布时间】:2020-05-11 05:54:09
【问题描述】:

我刚刚开始使用 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如何改进这段代码?

【问题讨论】:

  • 为什么要将元组转换为字符串并返回,而不是像在 else 语句中那样直接迭代它?
  • 当我传递 arg 参数时,它被转换为一个单元素元组。所以,我无法遍历它。
  • 然后试试for i in arg[0]:
  • 谢谢,arg[0] 以一种我可以直接循环的方式工作。但是求百万数乘积的问题依然存在。
  • 对于较小的数字:math.factorial(1000) (reduce(mul, range(1, 1000 + 1))) 但对于 1000_000,答案太大:您可以 use Stirling formula to estimate log of the answer: n*log(n)-n

标签: python python-3.x list function out-of-memory


【解决方案1】:

您可以在 Python 中使用Generator

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

list(generate_product())[0]

内存效率更高,性能更好。

【讨论】:

    【解决方案2】:

    要计算从 1 到 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 计算得非常好。

    【讨论】:

    • 谢谢。但我试图创建一个函数,在其中输入任何数字列表并获取产品。我提到前一百万个数字是因为在测试我的函数时,它显示了内存错误。
    【解决方案3】:

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

    n的位数! = log10(1) + log10(2) + ... log10(n)

    import math
    num_dig = 1
    for i in range(1,1000000):
      num_dig += math.log10(i)
    print(num_dig)
    

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

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

    import math
    ans = 1
    for i in range(2,1000001):
      ans *= i
    print(ans)
    

    注意:您可以使用对数和斯特林数进行近似,运行时间更快。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 2017-10-10
        • 2013-12-31
        相关资源
        最近更新 更多