一个简单的程序,用于计算数字平方并存储结果:

    import time
    from joblib import Parallel, delayed
    import multiprocessing

    array1 = [ 0 for i in range(100000) ]

    def myfun(i):
        return i**2

    #### Simple loop ####
    start_time = time.time()

    for i in range(100000):
        array1[i]=i**2

    print( "Time for simple loop         --- %s seconds ---" % (  time.time()
                                                               - start_time
                                                                 )
            )
    #### Parallelized loop ####
    start_time = time.time()
    results = Parallel( n_jobs  = -1,
                        verbose =  0,
                        backend = "threading"
                        )(
                        map( delayed( myfun ),
                             range( 100000 )
                             )
                        )
    print( "Time for parallelized method --- %s seconds ---" % (  time.time()
                                                               - start_time
                                                                 )
            )
    #### Output ####
    # >>> ( executing file "Test_vr20.py" )
    # Time for simple loop         --- 0.015599966049194336 seconds ---
    # Time for parallelized method --- 7.763299942016602 seconds ---

这两个选项的数组处理是否可能有所不同?我的实际程序会有一些更复杂的东西,但是这是我需要并行化的一种计算,尽可能简单地,但是没有这样的结果。
System Model: HP ProBook 640 G2, Windows 7,
              IDLE for Python System Type: x64-based PC Processor:
              Intel(R) Core(TM) i5-6300U CPU @ 2.40GHz,
              2401 MHz,
              2 Core(s),
              4 Logical Processor(s)

最佳答案

threadingdocumentation中:



问题是在这种情况下,您不知道这一点。 Python本身仅允许一次运行一个线程(Python解释器每次执行python操作时都会锁定GIL)。
threading仅在myfun()将大部分时间都用在编译的Python扩展程序中并且该扩展程序释放GIL时才有用。
Parallel代码是如此令人尴尬的缓慢,因为您正在做大量工作来创建多个线程-然后您一次只能执行一个线程。

如果使用multiprocessing后端,则必须将输入数据复制到四个或八个进程中的每个进程中(每个内核一个),在每个进程中进行处理,然后再将输出数据复制回去。复制将会很慢,但是如果处理比仅仅计算一个平方稍微复杂一点,那可能是值得的。测量并查看。

09-10 01:22
查看更多