Python 计算从1-10000内的素数(多线程demo)
Python 计算从1-10000内的素数
素数:质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
利用for循环从1-10000将值赋值给i
在函数中判断i是否为素数,用这个数求余这个数以内的数判断余数是否为0
素数返回True,不是素数返回False
代码:
def sushu(i):
if i == 1:
return False
for num in range(2, i):
if i % num == 0:
return False
else:
return True
if __name__ == '__main__':
su = []
for i in range(1, 10000):
if sushu(i):
su.append(i)
print(su)
在这里就实现了输出1-10000的素数。
接下来对上面代码进行一点点优化:
提示:素数不要从1除到n-1,只要到n//2+1
def sushu(i):
if i == 1:
return False
for num in range(2, i//2+1):
if i % num == 0:
return False
else:
return True
if __name__ == '__main__':
su = []
for i in range(1, 10000):
if sushu(i):
su.append(i)
print(su)
以上就完成了对1-10000素数的判断,结果和上面的代码是一样的
我在代码中另外添加了对列表su进行一个长度的输出,10000以内的素数有1229个
接下来,运用学习到的多线程基础对这两个代码进行测试
这里将循环提高到50000次
import threading
from time import ctime
def dosushu1():
print('sushu1 staring at:', ctime())
su = []
for i in range(1, 50000):
if sushu1(i):
su.append(i)
print('sushu1 done:', ctime())
def sushu1(i):
if i == 1:
return False
for num in range(2, i//2+1):
if i % num == 0:
return False
else:
return True
def dosushu2():
print('sushu2 staring at:', ctime())
su = []
for i in range(1, 50000):
if sushu2(i):
su.append(i)
print('sushu2 done:', ctime())
def sushu2(i):
if i == 1:
return False
for num in range(2, i):
if i % num == 0:
return False
else:
return True
if __name__ == '__main__':
print('Starting at:', ctime())
t1 = threading.Thread(target=dosushu1, args=())
t2 = threading.Thread(target=dosushu2, args=())
t1.start()
t2.start()
t1.join()
t2.join()
print('ALL done at: ', ctime())
结果:
稍微优化后的代码比原本的快了不少
本次主要还是解决计算1-10000素数的问题
下面我给代码加上注释
顺便学习了多线程的基本使用