Python 多处理需要更多时间
Python multiprocessing takes more time
我的服务器有 12 个内核和 28GB 内存。我是运行两个版本的Python;一个具有多处理功能,另一个具有顺序功能。我希望 Multiprocessing.py 比 Sequential.py 更早完成,但与顺序代码(25 秒)相比,多处理代码需要多 5 倍(120 秒)
Multiprocessing.py
import os,multiprocessing,time
def cube(x):
print(x**3)
return
if __name__ == '__main__':
jobs = []
start = time.time()
for i in range(5000):
p = multiprocessing.Process(target=cube(i))
jobs.append(p)
p.start()
end = time.time()
print end - start
Sequential.py
import os,time
def cube(x):
print(x**3)
return
if __name__ == '__main__':
start = time.time()
for i in range(5000):
cube(i)
end = time.time()
print end - start
你能帮忙吗?
问题是相对于 IPC 通信开销而言,完成的工作太少。
cube 函数不适合多处理加速。尝试一些 "more interesting" 之类的函数来计算 1 到 n 的立方之和或类似的东西:
import os, multiprocessing, time
def sum_of_cubes(n):
return sum(x**3 for x in range(n))
if __name__ == '__main__':
from multiprocessing.pool import ThreadPool as Pool
pool = Pool(25)
start = time.time()
print(pool.map(sum_of_cubes, range(1000, 100000, 1000)))
end = time.time()
print(end - start)
一般规则是:
- 不要启动超过核心可以从中受益的池
- 不要传入大量数据或return大量数据(IPC负载过大)
- 在与 IPC 开销相关的过程中做大量工作。
您不应该为每个乘法都启动一个过程。启动 12 个进程并向每个进程传递编号或在进程创建时分发编号。
如果您配置文件我相当确定您会发现您所有的时间都花在进程创建和清理上。
另外:我已经测试了有多少进程 运行 与核心数量的关系,最佳取决于架构(例如,一些英特尔芯片每个核心有 2 个线程)和操作系统(Linux 似乎比 Windows 处理得更好。如果您使用的是 windows,我建议您尝试使用 0.8-2.2 倍核心数的进程数。在 Linux 你可以做更多。
你想试试台球吗?例如,以下应该有效:
from multiprocessing import Pool
p = Pool(12)
Results = p.map(cube, range(5000))
我的服务器有 12 个内核和 28GB 内存。我是运行两个版本的Python;一个具有多处理功能,另一个具有顺序功能。我希望 Multiprocessing.py 比 Sequential.py 更早完成,但与顺序代码(25 秒)相比,多处理代码需要多 5 倍(120 秒)
Multiprocessing.py
import os,multiprocessing,time
def cube(x):
print(x**3)
return
if __name__ == '__main__':
jobs = []
start = time.time()
for i in range(5000):
p = multiprocessing.Process(target=cube(i))
jobs.append(p)
p.start()
end = time.time()
print end - start
Sequential.py
import os,time
def cube(x):
print(x**3)
return
if __name__ == '__main__':
start = time.time()
for i in range(5000):
cube(i)
end = time.time()
print end - start
你能帮忙吗?
问题是相对于 IPC 通信开销而言,完成的工作太少。
cube 函数不适合多处理加速。尝试一些 "more interesting" 之类的函数来计算 1 到 n 的立方之和或类似的东西:
import os, multiprocessing, time
def sum_of_cubes(n):
return sum(x**3 for x in range(n))
if __name__ == '__main__':
from multiprocessing.pool import ThreadPool as Pool
pool = Pool(25)
start = time.time()
print(pool.map(sum_of_cubes, range(1000, 100000, 1000)))
end = time.time()
print(end - start)
一般规则是:
- 不要启动超过核心可以从中受益的池
- 不要传入大量数据或return大量数据(IPC负载过大)
- 在与 IPC 开销相关的过程中做大量工作。
您不应该为每个乘法都启动一个过程。启动 12 个进程并向每个进程传递编号或在进程创建时分发编号。
如果您配置文件我相当确定您会发现您所有的时间都花在进程创建和清理上。
另外:我已经测试了有多少进程 运行 与核心数量的关系,最佳取决于架构(例如,一些英特尔芯片每个核心有 2 个线程)和操作系统(Linux 似乎比 Windows 处理得更好。如果您使用的是 windows,我建议您尝试使用 0.8-2.2 倍核心数的进程数。在 Linux 你可以做更多。
你想试试台球吗?例如,以下应该有效:
from multiprocessing import Pool
p = Pool(12)
Results = p.map(cube, range(5000))