Dir*_*uin 5 python multithreading multiprocessing python-2.7
是否可以使用多处理/线程加速单个任务?我的直觉是答案是'不'.以下是"单一任务"的含义示例:
for i in range(max):
pick = random.choice(['on', 'off', 'both'])
Run Code Online (Sandbox Code Playgroud)
参数为10000000,在我的系统上完成大约需要7.9秒.
我基本掌握了如何使用多处理和线程处理多个任务.例如,如果我有10个目录,每个目录包含需要读取的X个文件,我可以使用create 10个线程.
我怀疑单个任务只使用一个进程(任务管理器报告CPU使用率很小).在这种情况下,有没有办法利用我的其他核心?或者是增加CPU /内存速度是获得更快结果的唯一方法?
以下是使用和不使用多处理的代码基准:
#!/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()
Run Code Online (Sandbox Code Playgroud)
这是我工作站上的结果(这是一个四核):
for loop with no multiproc:
8.31032013893
map with no multiproc:
9.48167610168
map with multiproc:
4.94983720779
Run Code Online (Sandbox Code Playgroud)
是否可以使用多处理/线程加速单个任务?我的直觉是答案是'不'.
好吧,afaict,答案是"该死的,是的".
在这种情况下,有没有办法利用我的其他核心?或者是增加CPU /内存速度是获得更快结果的唯一方法?
是的,通过使用多处理.由于GIL,Python无法使用线程处理多个核心,但它可以依靠操作系统的调度程序来利用其他核心.然后,您可以对您的任务进行真正的改进.
| 归档时间: |
|
| 查看次数: |
6931 次 |
| 最近记录: |