Код можно переписать для облегчения чтения и повышения производительности следующим образом.
Рефакторинг кода
def is_prime(n):
" Returns True if prime False otherwise "
# Base cases
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
# checking odd numbers 3, 5, ...
return next((False for i in range(3, int(n**0.5) + 1, 2) if n % i == 0), True)
def next_prime(n):
" First prime number greater or equal to n "
if n <= 2:
return 2
while not is_prime(n):
if n % 2:
n += 2 # stay on odd
else:
n += 1 # switch to odd
return n
def next_prime_batch(b):
" Finds next prime for a batch of numbers "
return [next_prime(x) for x in b]
Улучшение производительности
Результат:
- 63% быстрее для исходных малых чисел (Тест 1 ниже)
- В 10 раз быстрее для больших чисел (Тест 2 ниже)
Тест
Протестировано с использованием timeit для большей точности
Исходный код преобразован в функцию
def isprime(a, d):
b=a
c=0
f=b**(0.5)
for i in range(1,int(f)+1):
if a%i==0 and c<=1:
c+=1
if c==1:
return d.append(b)
else:
b=a+1
isprime(b,d)
def calc_next_primes(b):
d=[]
for i in b:
isprime(i,d) #function call
return b
Время Код
Тест 1 - только небольшое улучшение для меньших чисел
b = [2, 89, 54,36, 74, 44, 19, 12]
count = 10000 # number of timing iterations
print(timeit(lambda: calc_next_primes(b), number = count))
print(timeit(lambda: next_prime_batch(b), number = count))
# calc_next_primes: 1.4129 seconds for 10K iterations
# next_prime_batch: 0.8683 seconds for 10K iterations
Тест 2 - улучшение в 10 раз для больших чисел
b = [12346, 1920131, 219112, 1423231]
count = 1000 # number of timing iterations
print(timeit(lambda: calc_next_primes(b), number = count))
print(timeit(lambda: next_prime_batch(b), number = count))
# calc_next_primes: 7.8703 seconds for 1K iterations
# next_prime_batch: 0.6200 seconds for 1K iterations