ホームページ > バックエンド開発 > Python チュートリアル > Pythonにおけるシングルスレッド、マルチスレッド、マルチプロセスの効率比較実験

Pythonにおけるシングルスレッド、マルチスレッド、マルチプロセスの効率比較実験

高洛峰
リリース: 2016-11-16 10:10:08
オリジナル
1666 人が閲覧しました

比較実験

データによると、マルチスレッドプロセスが CPU を集中的に使用する場合、マルチスレッドは効率をあまり向上させません。逆に、スレッドの頻繁な切り替えにより効率が低下する可能性があります。マルチスレッドを使用する; IO 集中型の場合、マルチスレッド プロセスは IO ブロックを待機している間のアイドル時間を利用して他のスレッドを実行し、効率を向上させることができます。そこで、実験に基づいてさまざまなシナリオの効率を比較します

| オペレーティング システム | メモリ |
|----------|------| --| --------|
| デュアルコア

(1) CPU を使用する計算機能を定義する

(3) IO集中型のファイル読み書き関数の定義

import requests
import time
from threading import Thread
from multiprocessing import Process
ログイン後にコピー

(4) ネットワークリクエスト関数の定義

def count(x, y):
    # 使程序完成150万计算
    c = 0
    while c < 500000:
        c += 1
        x += x
        y += y
ログイン後にコピー

(5) IO集中型の操作、CPU集中型の操作、およびネットワークリクエストの線形実行に必要な時間をテストする-集中的な操作

def write():
    f = open("test.txt", "w")
    for x in range(5000000):
        f.write("testwrite\n")
    f.close()

def read():
    f = open("test.txt", "r")
    lines = f.readlines()
    f.close()
ログイン後にコピー

出力

CPU集中型: 95.6059999466、91.57099986076355 92.52800011634827、99.96799993515015

IO集中型: 21.7、 6699995994568、21.76999998 0926514、22.060999870300293

ネットワークリクエスト集中: 4.519999980926514、8.563999891281128、4.371000051498413 、4.522000074386597、14.671000003 814697

( 6) マルチスレッド同時実行のテスト CPU 集中型の操作に必要な時間

_head = {
            &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36&#39;}
url = "http://www.tieba.com"
def http_request():
    try:
        webPage = requests.get(url, headers=_head)
        html = webPage.text
        return {"context": html}
    except Exception as e:
        return {"error": e}
ログイン後にコピー

出力: 99.9240000248、101.26400017738342、102.32200002670288

(7) IO 集中型の操作のマルチスレッド同時実行に必要な時間をテストします

# CPU密集操作
t = time.time()
for x in range(10):
    count(1, 1)
print("Line cpu", time.time() - t)

# IO密集操作
t = time.time()
for x in range(10):
    write()
    read()
print("Line IO", time.time() - t)

# 网络请求密集型操作
t = time.time()
for x in range(10):
    http_request()
print("Line Http Request", time.time() - t)
ログイン後にコピー

出力: 25.697000026702 88. 24.02400016784668

(8) マルチスレッド同時実行ネットワーク集中テスト 操作に必要な時間

counts = []
t = time.time()
for x in range(10):
    thread = Thread(target=count, args=(1,1))
    counts.append(thread)
    thread.start()

e = counts.__len__()
while True:
    for th in counts:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print(time.time() - t)
ログイン後にコピー

出力: 0.7419998645782471, 0.3839998245239258, 0.3900001049041748

(9) 複数のプロセスが CPU 負荷の高い操作を同時に実行するのに必要な時間をテストします

def io():
    write()
    read()

t = time.time()
ios = []
t = time.time()
for x in range(10):
    thread = Thread(target=count, args=(1,1))
    ios.append(thread)
    thread.start()

e = ios.__len__()
while True:
    for th in ios:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print(time.time() - t)
ログイン後にコピー

出力: 54.3420000 07629395, 53.437999963760376

(10) IO集中型操作のマルチプロセス同時実行のテスト

t = time.time()
ios = []
t = time.time()
for x in range(10):
    thread = Thread(target=http_request)
    ios.append(thread)
    thread.start()

e = ios.__len__()
while True:
    for th in ios:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print("Thread Http Request", time.time() - t)
ログイン後にコピー

出力: 12.509000062942505, 15258789

(11) 複数のプロセスによる HTTP リクエスト集中型の操作の同時実行のテスト

counts = []
t = time.time()
for x in range(10):
    process = Process(target=count, args=(1,1))
    counts.append(process)
    process.start()
e = counts.__len__()
while True:
    for th in counts:
        if not th.is_alive():
            e -= 1
    if e <= 0:
        break
print("Multiprocess cpu", time.time() - t)
ログイン後にコピー

出力: 0.5329999923706055, 0.4760000 705718994

実験結果

Pythonにおけるシングルスレッド、マルチスレッド、マルチプロセスの効率比較実験上記の結果から、次のことがわかります:

IO ではマルチスレッドには大きな利点がないようです集中的な操作(おそらく利点) IO 操作タスクが重い場合は反映されます)。CPU 集中型の操作では、パフォーマンスは明らかにシングル スレッドの実行よりも劣りますが、スレッドのブロックを待機しているネットワーク リクエストなどの操作では利点があります。マルチスレッド化は非常に重要です

マルチプロセスは、CPU 集中型、IO 集中型、またはネットワーク要求集中型 (スレッド ブロッキングが頻繁に発生する) 操作のいずれかであるため、パフォーマンス上の利点が反映されます。ただし、ネットワークリクエストが集中する操作の場合は、マルチスレッドとほぼ同じですが、CPUなどのリソースをより多く消費するため、この場合はマルチスレッドを選択して実行できます

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート