一个简单的程序,用于计算数字平方并存储结果:
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)
从以下文档中threading:
threading
如果您知道所调用的函数基于已编译的扩展,该扩展会在大多数计算过程中释放Python全局解释器锁(GIL)…
问题在于,在这种情况下,您不知道这一点。Python本身仅允许一次运行一个线程(python解释器每次执行python操作时都会锁定GIL)。
threading仅当myfun()大部分时间都用在已编译的Python扩展程序中 并且该扩展程序释放GIL 时,它才有用。
myfun()
该Parallel代码之所以令人尴尬地缓慢,是因为您正在做大量工作来创建多个线程-然后您一次只能执行一个线程。
Parallel
如果使用multiprocessing后端,则必须将输入数据复制到四个或八个进程中的每个进程中(每个内核一个),在每个进程中进行处理,然后再将输出数据复制回去。复制将会很慢,但是如果处理比仅仅计算一个平方稍微复杂一点,那可能是值得的。测量并查看。
multiprocessing