【问题标题】:Execution Timed Out(12000ms). How can I optimize my code?执行超时(12000 毫秒)。如何优化我的代码?
【发布时间】:2022-12-21 04:25:35
【问题描述】:

我正在尝试解决 Codewars kata,该代码适用于小数字,但大数字运行太多并在 12 秒后停止。代码必须返回[n个以下的纯奇数素数,小于n的最大纯奇数素数,大于n的最小纯奇数素数]。我如何优化才能运行得更快?

def only_oddDigPrimes (n): # P.O.D.P (pure ood digit prime)
    prime, primeodd, result = [], [], []
    i = 2
    loop = True
    while loop:
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            if i < n:
                for a in range(len(str(i))):
                    if int(str(i)[a]) % 2 == 0:
                        break
                else:
                    prime.append(i)
            if i > n:
                for b in range(len(str(i))):
                    if int(str(i)[b]) % 2 == 0:
                        break
                else:
                    result.append(i)  
                    loop = False
        i = i + 1
    
    
    for i in prime:
        if int(str(i)[0]) % 2 != 0 and i < n:
            primeodd.append(i)
    result.insert(0, primeodd[-1])
    result.insert(0, len(primeodd))
    print(result)
    
    return result

【问题讨论】:

  • “纯”奇数的定义是什么?根据定义,素数是奇数,因为任何偶数都可以被 2 整除?
  • 要优化您的代码,请考虑如何替换 ``` for j in range(2, i) ``` 循环,因为我认为这是您基本效率低下的原因。
  • 纯奇数,表示结果数中没有偶数。比如23就不好,因为2是偶数。关于优化。是的,我认为这是问题所在,但在我看来,现在没有任何其他解决方案来检查质数。
  • 查看 fastest-way-to-list-all-primes-below-n 以获取列出所有小于特定数字的素数的方法

标签: python-3.x


【解决方案1】:

使用前面引用的 Stackoverflow 答案,这就是我解决这个问题的方法:

import itertools

def erat():
    # function to implement sieve
    D = {}
    yield 2
    for q in itertools.islice(itertools.count(3), 0, None, 2):
        p = D.pop(q, None)
        if p is None:
            D[q * q] = q
            yield q
        else:
            x = p + q
            while x in D or not (x & 1):
                x += p
            D[x] = p

def get_primes(n: int) ->list:
    # function to list all primes less than or equal to n
    return list(itertools.takewhile(lambda p: p<=n, erat()))


def only_oddDigPrimes(n):
    # function to report on oddDigit Primes
    primes = get_primes(n*2)
    oddPrimes = []
    for pn in primes:
        add = True
        val = str(pn)
        for j in range(len(val)):
            if int(val[j]) % 2 == 0:
                add = False
                break
        if add:
            if pn > n:
                return [len(oddPrimes), oddPrimes[-1], pn]
            oddPrimes.append(pn)        

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-07
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多