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