【发布时间】:2018-03-25 10:09:27
【问题描述】:
一个计算数字平方并存储结果的简单程序:
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)
【问题讨论】:
-
如果您将
map(myfun, range(100000))与并行代码进行比较,这可能是一个公平的比较。哦,顺便说一句,i ^ 2是i XOR 2,如果你想平方i,你需要i ** 2。 -
谢谢;更正了^。我如何将非并行简单执行与最快的并行计算进行比较?
-
python 中的函数调用有很大的开销,只需将没有函数调用的第一个循环与
map(myfun, range(100000))进行比较,没有任何并行性。如果您没有在非并行代码中使用该函数,则函数调用开销会严重影响结果。无论哪种方式,多处理都是一种权衡,在您使用实际程序进行尝试和测量之前,您不会知道它是否是一个好的权衡。 -
关于函数调用的信息很有用,我正在尝试使用 map()。实际上,我试图首先对此进行排序,因为这似乎是一个容易实现的目标(与我需要的更多涉及的计算相比),但我现在相信它可能不是这样。我认为应该有一些设施可以将每个处理器内核分配给 for 循环的某些部分。说核心 0 表示索引 0 到 3,核心 1 表示 4 到 7 等等。
标签: python arrays function parallel-processing