from time import perf_counter as timer
from multiprocessing.pool import ThreadPool as Pool
def is_prime(number):
for i in range(2,number):
if (number % i) == 0:
return False
return True
def acual_do(i):
if is_prime(i):
print(i)
def single(tedad):
for i in range(tedad):
acual_do(i)
def multi(tedad):
pool = Pool(4)
for i in range(tedad):
pool.apply_async(acual_do, (i,))
pool.close()
pool.join()
if __name__ == "__main__":
tedad = 100000
start = timer()
single(tedad)
end_single = timer() - start
start = timer()
multi(tedad)
end_multi = timer() - start
print()
print(end_single, end_multi)
def is_prime(number):
for i in range(2,floor(sqrt(number))+1):
if (number % i) == 0:
return False
return True
از تردها نمیتونید کمک بگیرید؟مشکل کنترل تعداد رشتهها به وجود میاد سیستم زیادی درگیر میشه و سرعت میاد پایین.
اگه عدد مورد نظر، از ۲ تا جزر عدد + ۱، به هیچکدوم بخشپذیر نباشه، حتما اول هست.اصلا نیازی به این کار هم نیست، هر عددی که به اعداد اول قبل از خودش بخشپذیر نباشه، عدد اول هست. نیاز به تست همه اعداد نیست.
به عبارتی لازم نیست از عددِ ۲ تا خود عدد مورد نظر رو بررسی کنید که بخشپذیر هست یا نه. بلکه کافیه فقط تا جذر اون عدد + ۱ رو بررسی کنید.
خب اعدادِ اولِ قبل از اون عدد مورد نظر رو از کجا بیاریم؟برنامهنوبسی پوبا!
میشه مستقیم یه سری از اون اعداد اول رو توی خود کد نوشت یا به شیوههای دیگه به برنامه داد ولی نمیتونیم که همه اعداد اول رو به برنامه بدیم چون مشخص نیست تعداد اعداد اول محدود هست یا نه.میدونیم. نامحدودن!
خب اینجوری اجرای برنامه خیلی طول نمیکشه؟خب اعدادِ اولِ قبل از اون عدد مورد نظر رو از کجا بیاریم؟برنامهنوبسی پوبا!
def list_prime(number: int) -> list:
primes=[2, 3, 5, 7]
for i in range(11, number, 2):
for prime in primes:
p=True
if i%prime == 0:
p=False
break
if p:
primes.append(i)
return primes
import threading
class Prime(threading.Thread):
def __init__(self, numbers):
threading.Thread.__init__(self)
self.numbers = numbers
def is_prime(self, num):
a = int(num / 2)
flag = True
for i in range(2, a+1):
if num%i == 0:
flag = False
break
return flag
def run(self):
for num in self.numbers:
print(str(num) + ' is : ' + str(self.is_prime(num)))
part1 = [2,3,4,5,6,7,8,9]
part2 = [10,11,12,546,56,8,7]
thread1 = Prime(part1)
thread2 = Prime(part2)
thread1.start()
thread2.start()
$ time python3 cs.py 100000
real 0m11.942s
user 0m11.931s
sys 0m0.008s
$ time pypy3 cs.py 100000
real 0m2.046s
user 0m2.010s
sys 0m0.016s
$ cat cs.py
import sys
def prime_list3(num):
num += 1
candidates = range(3, num, 2)
results = [2]
while len(candidates):
t = candidates[0]
results.append(t)
candidates = [i for i in candidates if not i in range(t, num, t)]
return results
number = int(sys.argv[1])
prime_list3(number)