簡體   English   中英

如果我使用多進程,為什么Python代碼運行速度較慢

[英]Why does Python code runs slower if I use muliple processes

您好,由於無法加快我的代碼的速度,我目前非常沮喪:我嘗試了其他事情,現在我使用了多處理器池。 為了評估Processornumbers的加速和效果,我改變了我使用的處理器數量。 但是,如果增加處理器數量,則會失去速度。 我不知道為什么,因為從理論上講,如果我有8個進程,我將並行計算8張圖像,如果我有4個進程,則我將計算4張圖像。 當然會有開銷,但這不應該是一個很大的瓶頸。 有人在這里發現錯誤嗎? 親切的問候馬克斯

'''
Created on 17.11.2017

@author: Max
'''
#!/usr/bin/env python

import os, sys, errno
import re
import argparse
from time import time
import multiprocessing
import glob
import numpy as np
import matplotlib.pyplot as plt
import cv2
def computeFeatures(input, chunk_num):
    thresholded_chunk = []
    #print("Processing Chunk,",chunk_num)
    cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV)
    cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV)
    cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV)
    cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV)
    thresholded_chunk.append(cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV))   
    return (thresholded_chunk, chunk_num)


if __name__ == '__main__':
    num_Proc = 2
    max_Proc = 20
    while num_Proc != max_Proc:

        start = time()
        # Handle command line options
        numProcessors = num_Proc

        # Start my pool
        pool = multiprocessing.Pool(numProcessors)

        # Build task list
        path = "InputSimulation\*" 
        tasks = []
        image_list= []
        img_idx = 0
        image_pathes = glob.glob(path+".jpg")
        results = []
        index_for_chunk = numProcessors
        while img_idx < len(image_pathes):
            #print("InsterImageNumber",img_idx)
            tasks.append( (cv2.imread(image_pathes[img_idx],0), img_idx, ) )
            if img_idx % numProcessors == 0:
                result = [pool.apply_async( computeFeatures, t ) for t in tasks]
                results.append(result)
                tasks = []
            img_idx +=1
        pool.close()
        pool.join()
            # Run tasks    #Flatten list before print

        end = time()
        print("DURATION FOR " +str(num_Proc) +" PROCESSES",end - start)
        num_Proc +=1
        # Process results

由於您不對apply_async使用任何回調函數,並且始終使用相同的函數(computeFeatures),因此最好使用Pool.map()。 在您當前的用例中,apply_async不會並行執行任何計算。 最重要的是,它將增加每次計算的開銷。

例:

from multiprocessing import Pool
from math import sqrt

p = Pool(8)
num_list = range(100000)

%%time
_ = p.map(sqrt, num_list)

CPU時間:用戶19毫秒,系統時間:2.36毫秒,總計:21.4毫秒

掛牆時間:27.7毫秒

%%time
_ = [sqrt(num) for num in num_list]

CPU時間:用戶33.7 ms,系統:5.93 ms,總計:39.6 ms

掛牆時間:37.5毫秒

%%time
_ = [p.apply_async(sqrt, num) for num in num_list]

CPU時間:用戶5.5 s,系統:1.37 s,總計:6.87 s

壁掛時間:5.95 s

如本例所示。 最好使用Pool.map()完成簡單的計算,將代碼更改為使用map,您可能會看到一些改進。 為您的系統和當前問題找到正確的工作人員數量也很重要。

result = pool.map(computeFeatures, tasks)

暫無
暫無

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

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