簡體   English   中英

Python多處理/線程比虛擬機上的單個處理花費更長的時間

[英]Python multiprocessing/threading takes longer than single processing on a virtual machine

我正在使用位於我公司大型機中的虛擬機。

我分配了4個核心,所以我正在嘗試並行處理我的Python代碼。 我還不熟悉它,我遇到了意想不到的行為,即多處理/線程比單個處理需要更長的時間。 我不知道我做錯了什么,或者問題來自我的虛擬機。

這是一個例子:

import multiprocessing as mg
import threading
import math
import random
import time

NUM = 4

def benchmark():
  for i in range(1000000):
    math.exp(random.random())

threads = []
random.seed()

print "Linear Processing:"
time0 = time.time()
for i in range(NUM):
  benchmark()
print time.time()-time0

print "Threading:"
for P in range(NUM):
  threads.append(threading.Thread(target=benchmark))
time0 = time.time()
for t in threads:
  t.start()
for t in threads:
  t.join()
print time.time()-time0

threads = []
print "Multiprocessing:"
for i in range(NUM):
  threads.append(mg.Process(target=benchmark))
time0 = time.time()
for t in threads:
  t.start()
for t in threads:
  t.join()
print time.time()-time0

結果是這樣的:

Linear Processing:
1.125
Threading:
4.56699991226
Multiprocessing:
3.79200005531

線性處理在這里是最快的,這與我想要和期望的相反。 我不確定如何執行join語句,所以我也用這樣的連接做了一個例子:

for t in threads:
  t.start()
  t.join()

現在這導致輸出如下:

Linear Processing:
1.11500000954
Threading:
1.15300011635
Multiprocessing:
9.58800005913

現在線程幾乎和單個處理一樣快,而多處理甚至更慢。

在任務管理器中觀察處理器負載時,即使在進行多處理時,四個虛擬內核的單個負載也不會超過30%,因此我懷疑這里存在配置問題。

我想知道我是否正確地進行基准測試,如果這種行為真的像我想的那樣奇怪。

所以,首先,你沒有做錯任何事情,當我在我的Macbook Pro上運行你的例子時,使用cPython 2.7.12,我得到:

$ python test.py
Linear Processing:
0.733351945877
Threading:
1.20692706108
Multiprocessing:
0.256340026855

但是,當我改變時,差異變得更加明顯:

for i in range(1000000):

至:

for i in range(100000000):

差異更明顯:

Linear Processing:
77.5861060619
Threading:
153.572453976
Multiprocessing:
33.5992660522

現在為什么線程一直變慢? 因為Global Interpreter Lock。 threading模塊唯一有用的就是等待I / O. 您的multiprocessing示例是執行此操作的正確方法。

因此,在您的原始示例中, Linear Processing是最快的,我會將此歸咎於啟動流程的開銷。 當您進行少量工作時,通常可能需要花費更多時間來啟動4個進程並等待它們完成,而不是僅僅在一個進程中同步完成工作。 使用更大的工作量來更逼真地進行基准測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM