我试图掌握python Parallelism。这是我使用
的代码import time
from concurrent.futures import ProcessPoolExecutor
def listmaker():
for i in xrange(10000000):
pass
#Without duo core
start = time.time()
listmaker()
end = time.time()
nocore = "Total time, no core, %.3f" % (end- start)
#with duo core
start = time.time()
pool = ProcessPoolExecutor(max_workers=2) #I have two cores
results = list(pool.map(listmaker()))
end = time.time()
core = "Total time core, %.3f" % (end- start)
print nocore
print core
我假设因为我使用两个核心,我的速度接近于两倍。但是,当我在大多数情况下运行此代码时,nocore
输出比core
输出快。即使我改变了
def listmaker():
for i in xrange(10000000):
pass
到
def listmaker():
for i in xrange(10000000):
print i
事实上,在某些运行中,no core
运行速度更快。有人能解释一下这个问题吗?我的设置正确吗?我做错了什么?
答案 0 :(得分:1)
您未正确使用pool.map()
。请查看pool.map文档。它需要一个可迭代的参数,它会将每个项目从iterable单独传递给池。由于您的函数只返回None
,因此无需执行任何操作。但是,您仍然需要产生额外进程的开销,这需要时间。
您对pool.map
的使用应如下所示:
results = pool.map(function_name, some_iterable)
请注意以下几点:
pool.map
无论如何都会返回一个列表。无需再将其转换为列表。pool.map
旨在为可迭代中的每个项调用一个函数,因此您的测试用例需要创建一些可迭代的函数,而不是像当前示例那样不带参数的函数。尝试使用函数的一些实际输入再次运行试验,并检索输出。这是一个例子:
import time
from concurrent.futures import ProcessPoolExecutor
def read_a_file(file_name):
with open(file_name) as fi:
text = fi.read()
return text
file_list = ['t1.txt', 't2.txt', 't3.txt']
#Without duo core
start = time.time()
single_process_text_list = []
for file_name in file_list:
single_process_text_list.append(read_a_file(file_name))
end = time.time()
nocore = "Total time, no core, %.3f" % (end- start)
#with duo core
start = time.time()
pool = ProcessPoolExecutor(max_workers=2) #I have two cores
multiprocess_text_list = pool.map(read_a_file, file_list)
end = time.time()
core = "Total time core, %.3f" % (end- start)
print(nocore)
print(core)
结果:
总时间,无核心,0.047
总时间核心,0.009
文本文件各有150,000行乱码。注意在并行处理值得之前必须完成多少工作。当我在每个文件中运行10,000行时,单一过程方法仍然更快,因为它没有产生额外进程的开销。但是,有了这么多工作要做,额外的流程值得付出努力。
顺便说一下,Python2中的multiprocessing pools可以使用此功能,因此如果您愿意,可以避免从期货中导入任何内容。