【问题标题】:Speed-up a single task using multi-processing or threading使用多处理或线程加速单个任务
【发布时间】:2013-06-23 15:08:51
【问题描述】:

是否可以使用多处理/线程加速单个任务?我的直觉是答案是否定的。这是我所说的“单一任务”的一个例子:

for i in range(max):
    pick = random.choice(['on', 'off', 'both'])

使用 10000000 的参数,在我的系统上完成大约需要 7.9 秒。

我基本掌握了如何使用多处理和线程处理多个任务。例如,如果我有 10 个目录,每个目录包含 X 个需要读取的文件,我可以使用创建 10 个线程。

我怀疑单个任务仅使用单个进程(任务管理器报告 CPU 使用率最低)。在这种情况下,有没有办法利用我的其他核心?还是提高 CPU/内存速度是获得更快结果的唯一方法?

【问题讨论】:

标签: python multithreading python-2.7 multiprocessing


【解决方案1】:

以下是您的代码在使用和不使用多处理的情况下的基准:

#!/usr/bin/env python

import random
import time

def test1():
    print "for loop with no multiproc: "
    m = 10000000
    t = time.time()
    for i in range(m):
        pick = random.choice(['on', 'off', 'both'])
    print time.time()-t

def test2():
    print "map with no multiproc: "
    m = 10000000
    t = time.time()
    map(lambda x: random.choice(['on', 'off', 'both']), range(m))
    print time.time()-t

def rdc(x):
    return random.choice(['on', 'off', 'both'])

def test3():
    from multiprocessing import Pool

    pool = Pool(processes=4)
    m = 10000000

    print "map with multiproc: "
    t = time.time()

    r = pool.map(rdc, range(m))
    print time.time()-t

if __name__ == "__main__":
    test1()
    test2()
    test3()

这是我的工作站(四核)上的结果:

for loop with no multiproc: 
8.31032013893
map with no multiproc: 
9.48167610168
map with multiproc: 
4.94983720779

是否可以使用多处理/线程加速单个任务?我的直觉是答案是否定的。

嗯,afaict,答案是“该死的,是的”。

在这种情况下,有没有办法利用我的其他内核?还是提高 CPU/内存速度是获得更快结果的唯一方法?

是的,通过使用多处理。由于 GIL,Python 无法使用线程处理多个内核,但它可以依赖操作系统的调度程序来利用其他内核。然后,您可以在任务上获得真正的改进。

【讨论】:

  • 答案是“该死的,是的”,前提是您使用的是一台好电脑。在我的上网本上,test3 比 test1 慢。
  • 答案“该死的是”取决于您的计算机拥有的内核数量。如果您创建的进程池具有与您获得的核心相同数量的进程,那么您将从中受益(假设您拥有多个核心)。如果你不这样做,它会是一样的(调度器不会创造奇迹)。
  • @zmo:3:16 可能会尖叫“该死,是的!”,但“该死的,是的”也有效 :) 谢谢。
  • 甜蜜的解决方案。您甚至不必自己启动和停止线程。
  • 奇怪的是,在我的机器上,用python3,结果完全不同:for loop with no multiproc: 25.41977310180664 map with no multiproc: 1.0967254638671875e-05 map with multiproc: 11.853065013885498
猜你喜欢
  • 2012-12-05
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 2020-09-01
  • 2015-09-03
  • 1970-01-01
相关资源
最近更新 更多