编写并行循环
Writing a parallel loop
我正在尝试 运行 一个简单示例的并行循环。
我做错了什么?
from joblib import Parallel, delayed
import multiprocessing
def processInput(i):
return i * i
if __name__ == '__main__':
# what are your inputs, and what operation do you want to
# perform on each input. For example...
inputs = range(1000000)
num_cores = multiprocessing.cpu_count()
results = Parallel(n_jobs=4)(delayed(processInput)(i) for i in inputs)
print(results)
代码的问题在于,当在 Python 3 中的 Windows 环境下执行时,它会打开 python 的 num_cores
个实例来执行并行作业,但仅一个是活跃的。这不应该是这种情况,因为处理器的 activity 应该是 100% 而不是 14%(在 i7 - 8 逻辑内核下)。
为什么额外的实例什么都不做?
在Windows,多处理模块使用'spawn'方法启动多个python解释器进程。这相对较慢。 Parallel 试图对代码进行 运行 智能处理。特别是,它会尝试调整批处理大小,以便执行一个批处理大约需要半秒。 (请参阅 https://pythonhosted.org/joblib/parallel.html 中的 batch_size 参数)
您的 processInput()
函数 运行 如此之快以至于 Parallel 确定在一个处理器上连续 运行 作业比启动多个 python 解释器更快和 运行 代码并行。
如果您想在多核上强制您的示例 运行,请尝试将 batch_size 设置为 1000 或使 processInput()
更复杂以便执行时间更长。
编辑:windows 上的工作示例显示正在使用的多个进程(我使用的是 windows 7):
from joblib import Parallel, delayed
from os import getpid
def modfib(n):
# print the process id to see that multiple processes are used, and
# re-used during the job.
if n%400 == 0:
print(getpid(), n)
# fibonacci sequence mod 1000000
a,b = 0,1
for i in range(n):
a,b = b,(a+b)%1000000
return b
if __name__ == "__main__":
Parallel(n_jobs=-1, verbose=5)(delayed(modfib)(j) for j in range(1000, 4000))
继续您提供工作多处理代码的请求,我建议您使用 pool_map(如果延迟功能不重要),我会给您举个例子,如果您正在python3值得一提的是你可以使用星图。
另外值得一提的是,如果返回结果的顺序不必与输入的顺序相对应,则可以使用 map_sync/starmap_async。
import multiprocessing as mp
def processInput(i):
return i * i
if __name__ == '__main__':
# what are your inputs, and what operation do you want to
# perform on each input. For example...
inputs = range(1000000)
# removing processes argument makes the code run on all available cores
pool = mp.Pool(processes=4)
results = pool.map(processInput, inputs)
print(results)
我正在尝试 运行 一个简单示例的并行循环。
我做错了什么?
from joblib import Parallel, delayed
import multiprocessing
def processInput(i):
return i * i
if __name__ == '__main__':
# what are your inputs, and what operation do you want to
# perform on each input. For example...
inputs = range(1000000)
num_cores = multiprocessing.cpu_count()
results = Parallel(n_jobs=4)(delayed(processInput)(i) for i in inputs)
print(results)
代码的问题在于,当在 Python 3 中的 Windows 环境下执行时,它会打开 python 的 num_cores
个实例来执行并行作业,但仅一个是活跃的。这不应该是这种情况,因为处理器的 activity 应该是 100% 而不是 14%(在 i7 - 8 逻辑内核下)。
为什么额外的实例什么都不做?
在Windows,多处理模块使用'spawn'方法启动多个python解释器进程。这相对较慢。 Parallel 试图对代码进行 运行 智能处理。特别是,它会尝试调整批处理大小,以便执行一个批处理大约需要半秒。 (请参阅 https://pythonhosted.org/joblib/parallel.html 中的 batch_size 参数)
您的 processInput()
函数 运行 如此之快以至于 Parallel 确定在一个处理器上连续 运行 作业比启动多个 python 解释器更快和 运行 代码并行。
如果您想在多核上强制您的示例 运行,请尝试将 batch_size 设置为 1000 或使 processInput()
更复杂以便执行时间更长。
编辑:windows 上的工作示例显示正在使用的多个进程(我使用的是 windows 7):
from joblib import Parallel, delayed
from os import getpid
def modfib(n):
# print the process id to see that multiple processes are used, and
# re-used during the job.
if n%400 == 0:
print(getpid(), n)
# fibonacci sequence mod 1000000
a,b = 0,1
for i in range(n):
a,b = b,(a+b)%1000000
return b
if __name__ == "__main__":
Parallel(n_jobs=-1, verbose=5)(delayed(modfib)(j) for j in range(1000, 4000))
继续您提供工作多处理代码的请求,我建议您使用 pool_map(如果延迟功能不重要),我会给您举个例子,如果您正在python3值得一提的是你可以使用星图。 另外值得一提的是,如果返回结果的顺序不必与输入的顺序相对应,则可以使用 map_sync/starmap_async。
import multiprocessing as mp
def processInput(i):
return i * i
if __name__ == '__main__':
# what are your inputs, and what operation do you want to
# perform on each input. For example...
inputs = range(1000000)
# removing processes argument makes the code run on all available cores
pool = mp.Pool(processes=4)
results = pool.map(processInput, inputs)
print(results)