5

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

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

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

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

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

4

1 回答 1

7

这是您的代码在有和没有多处理的情况下的基准:

#!/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 无法使用线程处理多个内核,但它可以依赖操作系统的调度程序来利用其他内核。然后,您可以真正改善您的任务。

于 2013-06-23T16:48:07.163 回答