1. 程式人生 > >Python 計算從1-10000內的素數(多執行緒demo)

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素數的問題

下面我給程式碼加上註釋

順便學習了多執行緒的基本使用