ipython并行client.map比python“map”慢得多?

时间:2015-05-05 20:54:28

标签: python parallel-processing ipython

我试图理解为什么我的负载均衡视图映射语句需要22秒才能在2个核心上执行,而不是仅使用内置映射在一个核心上执行10 ms。我知道并行工作有一个与之相关的开销,但这无法解释额外的22秒。我究竟做错了什么?

我在Intel Core2Duo Mac上运行Python 2.7。 OS X.10。

In [4]: from IPython.parallel import Client

In [5]: rc = Client()

In [6]: lview = rc.load_balanced_view()

In [7]: lview.block = True

In [8]: %timeit map(lambda x:x**10, range(3000))
100 loops, best of 3: 9.91 ms per loop

In [9]: %timeit lview.map(lambda x:x**10, range(3000))
1 loops, best of 3: 22.8 s per loop

2 个答案:

答案 0 :(得分:2)

只有很多的开销。您必须通过消息队列将作业发送到工作人员,用于您执行的每个循环。如果你更聪明地分配你的工作,它会更有效率(但仍然没有单线程版本那么高效):

In [7]: %timeit map(lambda x:x**10, range(3000))
100 loops, best of 3: 3.17 ms per loop

In [8]: %timeit lview.map(lambda i:[x**10 for x in range(i * 500)], range(6))  # I'm using 6 cores
100 loops, best of 3: 11.4 ms per loop

In [9]: %timeit lview.map(lambda i:[x**10 for x in range(i * 1500)], range(2))
100 loops, best of 3: 5.76 ms per loop

如果您的工作量足够大,并行化可以带来回报:

In [10]: %timeit lview.map(lambda i:len([x**10 for x in range(i * 500000)]), range(6))
1 loops, best of 3: 2.86 s per loop

In [11]: %timeit map(lambda x:x**10, range(3000000))
1 loops, best of 3: 3.41 s per loop

答案 1 :(得分:1)

正如univerio所说,有相当大的开销。使用非常快的任务对IPython.parallel进行测试会导致性能不佳。您的任务几乎没有时间完成,并且比简单的开销更简单。如果每个任务需要一秒钟才能完成,另一方面,IPython.parallel会更有用。请记住,系统的设计不仅适用于跨多个内核分发任务,还适用于可能具有非常不同环境的多台计算机,未运行预共享代码,并且不一定具有共享内存或磁盘。我过去曾经有一个控制器在运行不同Python版本和不同操作系统的不同城市的许多计算机上将任务分配到300 cpu。所有这些都需要相当多的开销。例如,当您发送任务时,您将发送所需的代码和数据。

然而,另一个问题是IPython的并行系统需要针对您提供的各种任务进行配置。特别是,ipcontroller配置中的高水位标记(HWM)设置对较小任务的性能具有显着影响。默认情况下,HWM设置为1,这意味着控制器向每个ipengine工作程序发送一个任务,并且在第一个任务返回给该工作程序之前不会向该工作程序发送新任务。这样做可以实现最佳的负载平衡,因为这意味着如果任务需要不同的时间,那么每次完成工作时,工作人员都会获得一项新任务,而更快的工作人员将获得更多任务。在某些情况下,这可能非常慢。

但是,如果您的任务很快,则意味着会有更多的开销。在这些情况下,将HWM设置为更高的值可能很有用。 HWM本质上是允许在引擎上执行多少任务的设置。将其设置为10,控制器将向每个引擎发送10个任务,然后在引擎降至10个以下未完成任务时发送新任务(单独)。

对于大量非常快速的任务,一个特别有用的设置是0的特殊设置。在这种情况下,控制器一次将所有任务分配给工人,然后等待他们回来了。

此设置为ipcontroller_config.py中的c.TaskScheduler.hwm。

相关问题