AndreyNill
@AndreyNill
Новичок в сфере программирования

Как мне ускорить код?

Здравствуйте! Написал код по поиску простого числа, на сайте, для которого он написан, не проходит по времени и прерывается. Как мне отредактировать данный код, чтобы не было данной проблемы?

import math
import random
def is_prime(n):
    if n % 2 == 0 and n > 2:
        return False
    return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
k = int(input())
number = 2
i = 0
while True:
    if is_prime(number):
        i += 1
        if i == k:
            break
    number += 1
print(number)
  • Вопрос задан
  • 244 просмотра
Пригласить эксперта
Ответы на вопрос 2
samodum
@samodum
Какой вопрос - такой и ответ
как минимум, надо прибавлять не +1, а +2, чтобы не брать чётные числа.
Вот тебе уже ускорение в два раза

А эта дичь вообще тормозная
all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))

избавься от неё
Ответ написан
Комментировать
@galaxy
Подкину еще вариант:
import math

def npr(k):
    x = 2*k*math.log(k)
    xp = 1
    while abs(x/xp-1) > 0.001:
        xp = x
        x = x - (x - k*math.log(x)) * math.log(x) / (math.log(x) - 1)
    return x

def rwh_primes(n):
    sieve = [True] * n
    for i in range(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)
    return [2] + [i for i in range(3,n,2) if sieve[i]]

k = int(input())
print( rwh_primes( int(npr(k)) + 1 )[k-1] )


Как работает:

rwh_primes - решето Эратосфена, не самая быстрая реализация, честно подсмотренная на SO

npr - функция вычисления натурального n, количество простых меньше которого больше или равно k
(на основе неравенства: k > n/ln(n) - функция реализует метод Ньютона для уравнения x/ln(x) = k)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы