在网上看到个程序,求100000以内质数之和。
分别用了多进程与单进程去计算,并且记录运行时间,但是结果却并没有差别。是配置出了问题吗,求解
import time
from multiprocessing import Process
# 装饰器
def timeis(f):
def wrapper(*args,**kwargs):
start_time = time.time()
res = f(*args,**kwargs)
end_time = time.time()
print("函数执行时间:",end_time-start_time)
return res
return wrapper
# 判断一个数n是否为质数
def isprime(n):
if n <= 1:
return False
for i in range(2,n//2+1):
if n % i == 0:
return False
return True
class Prime(Process):
def __init__(self,begin,end):
self.begin = begin
self.end = end
super().__init__()
def run(self):
prime = []
for i in range(self.begin,self.end):
if isprime(i):
prime.append(i) # 是质数加到列表中
print(sum(prime))
@timeis
def multi_process(n):
jobs = []
step = 100000//n
for i in range(1,100001,step):
p = Prime(i,i+step) # 数值区间
jobs.append(p)
p.start()
[i.join() for i in jobs]
# @timeis
# def prime_sum():
# prime = []
# for i in range(1,100001):
# if isprime(i):
# prime.append(i) # 是质数加到列表中
# print(sum(prime))
if __name__ == '__main__':
multi_process(4)
# 函数执行时间: 21.11165142059326
# multi_process(4)
# 函数执行时间: 21.652815103530884
# prime_sum()
比如找到的最新质数是37 把100000 分成4段 (0,25000] ,(25000,50000],(50000,75000],(75000,100000] 4个分段内,找到第一个37的倍数。
(0/37+1) * 37 =37, (25000/37 + 1)*37=25012, (50000/37 + 1)*37=50024,(75000/37 + 1)*37=75036 四个线程分别拿着这个起始数,按37步长自增,打标记。