python中的多处理池花费了更多时间

时间:2018-02-15 19:22:44

标签: python time multiprocessing reduce pool

所以,我开始在python中学习多处理。我为函数'res'创建了一个池。我对使用游泳池和使用正常方式运行程序后的时间感兴趣,我认为如果我使用池处理时间会减少,但正如我所见,池花了10.0413179397583秒(s)和正常方式花了0.005002737045288086秒(s)。我错过了什么?

import multiprocessing as mp
import time

def res(a):
    squ = 0
    for i in range(a):
        squ += i**2
    return squ

if __name__ == "__main__":

    t1 = time.time()
    p = mp.Pool()
    result = p.map(res, range(10000))
    p.close()
    p.join()
    print(time.time()-t1)

    t2 = time.time()
    result = []
    sum = 0
    for i in range(10000):
        sum += i**2
        result.append(sum)
    print(time.time()-t2)

3 个答案:

答案 0 :(得分:0)

multiprocessing一起使用的算法是O(n^2)(循环为1,循环为2,...循环为9999),而“正常方法”为O(n)。没有multiprocessing,第一种方式在我的测试中花了大约3倍。

相关:What is a plain English explanation of “Big O” notation?

答案 1 :(得分:0)

您的pool示例正在计算10000个不同的循环,每个循环来自0-9999个迭代。您的第二个示例是单个循环,其中9999次迭代...

这是一种巧妙的方法:

import multiprocessing as mp
import time
import sys

NUM_ITER = int(sys.argv[1])
def res(a):
    squ = 0
    for i in range(a):
        squ += i**2
    return squ

if __name__ == "__main__":

    t1 = time.time()
    p = mp.Pool(None)
    result = p.map(res, range(NUM_ITER))
    p.close()
    p.join()
    print(f"With multiprocessing: {time.time()-t1}")

    t2 = time.time()
    result = [res(i) for i in range(NUM_ITER)]
    print(f"Without multiprocessing: {time.time()-t2}")

注意,multiprocessing因为开销需要更长的时间,除非你进行了大量的迭代,所以请考虑:

Juans-MacBook-Pro:temp juan$ python -B timing_mp.py 100
With multiprocessing: 0.18288207054138184
Without multiprocessing: 0.002610921859741211
Juans-MacBook-Pro:temp juan$ python -B timing_mp.py 1000
With multiprocessing: 0.1448049545288086
Without multiprocessing: 0.16153407096862793
Juans-MacBook-Pro:temp juan$ python -B timing_mp.py 5000
With multiprocessing: 2.273800849914551
Without multiprocessing: 3.9749832153320312
Juans-MacBook-Pro:temp juan$ python -B timing_mp.py 10000
With multiprocessing: 8.837619066238403
Without multiprocessing: 15.725339889526367

答案 2 :(得分:0)

Dan Foreman-Mackey emcee 这个包进行了很好的讨论。

如果函数调用的计算时间与多处理的开销相比并不大,那么您将发现没有任何优势。您可以使用类似下面的函数调用来相对轻松地演示这个

import time
def func():
    """ arbitrarily time-intensive function """
    time.sleep(1)   # return after 1 s "computation time"
    return