【问题标题】:Why is one code faster than the other为什么一个代码比另一个代码快
【发布时间】:2017-11-27 01:58:47
【问题描述】:

感谢所有回复,我编辑了我的问题和代码,以便它们更好地工作。抱歉之前没有更清楚。

我是 python 新手并且已经学习了基础知识,我现在正在参加在线课程,我想知道为什么我将在这里放置的第二个代码比第一个快得多。这些代码是为了得到组成一个数字的素数的列表,我觉得这两个代码在时间上应该是相似的,但它们不是:

代码 1)

def getprime(x):
    j=[]
    for i in range (2,x+1):
        while x%i==0:
                j.append(i)
                x=x/i

    return j

2)

def get_primes(n):
    result = []
    for i in range(2, n + 1):
        s = 0
        while n % i == 0:
            n = n / i
            s += 1
        if s > 0:
            for k in range(s):
                result.append(i)
            if n == 1:
                return result

我使用的数字是 95485200,我可以看到性能上的巨大差异,这在 jupyter notebook 中使用 %%timeit 证实了较小的数字,我觉得这很奇怪,因为代码的前几行几乎相同。

谢谢。

【问题讨论】:

  • 函数在执行return 后立即停止。想想每个函数何时执行其return。此外,第一个函数中range(2, x) 上的循环使用x 的原始值,即使x 发生变化,所以x 到达1 不会停止循环。
  • (另外,您的第一个函数因主要输入而损坏。)
  • 你应该描述你想要做什么。也许找到主要因素?测试素数?你也不是真的在做。查看How to Ask 并编辑您的问题
  • 顺便说一句,你不应该在这里使用/,因为它会返回浮点数。相反,请使用地板除法运算符//
  • @user2357112 是对的;关键是第一个示例在x 到达1 时不会停止循环,并且范围对于素数输入来说太小了。

标签: python python-3.x for-loop while-loop


【解决方案1】:

第一个代码检查数字是否可以被一个因子整除两次if x%i==0: ...

while x%i==0: ...,第一段代码也创建了多个 x 的实例:x=x/i

更有效的代码是:

def prime(num):
    if num == 1 or num == 0:
        return False
    prime = True
    for i in range(2, num):
        if num % i == 0:
            prime = False

    return prime

【讨论】:

  • 这个问题并不完全清楚,但 OP 不仅仅是在做素数测试:他们想要一个素数列表。
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2011-08-22
  • 2023-03-05
  • 2014-11-10
相关资源
最近更新 更多