并行速度

时间:2015-03-21 03:15:34

标签: python performance parallel-processing

我试图掌握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运行速度更快。有人能解释一下这个问题吗?我的设置正确吗?我做错了什么?

1 个答案:

答案 0 :(得分:1)

您未正确使用pool.map()。请查看pool.map文档。它需要一个可迭代的参数,它会将每个项目从iterable单独传递给池。由于您的函数只返回None,因此无需执行任何操作。但是,您仍然需要产生额外进程的开销,这需要时间。

您对pool.map的使用应如下所示:

results = pool.map(function_name, some_iterable)

请注意以下几点:

  • 由于您使用的是print语句而不是函数,我假设您正在使用某些Python2变体。在Python2中,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可以使用此功能,因此如果您愿意,可以避免从期货中导入任何内容。