gpt4 book ai didi

Python 多处理代码运行速度比单线程代码慢

转载 作者:行者123 更新时间:2023-12-01 00:53:51 26 4
gpt4 key购买 nike

我的 i7 7700HQ 上的 Python 多处理性能明显慢于非并行处理器。

在计划在 mssql 中并行化我的单表数据库的选择和更新代码时,我尝试首先并行化一个简单的代码。该程序只是打印参数的倍数。我尝试使用 Process 对象和 Pool 对象进行单线程、多进程。单线程始终表现最佳。

import time

def foobar(a):
for i in range(1,10000):
print(a*i)
return
if __name__ == "__main__":
Tthreading = time.clock()
p1= Process(target= foobar, args=(3,))
p2 = Process(target= foobar, args= (2,))
p3 = Process(target= foobar, args= (4,))
p4 = Process(target=foobar, args=(123,))

allprocess.start

allprocess.join

print(time.clock() - Tthreading)

#Single-threaded
Tsingle = time.clock()
foobar(3)
foobar(2)
foobar(4)
foobar(123)
print(time.clock() - Tsingle)


我预计多进程会更快,因为没有共享资源(没有需要在线程之间访问的函数、变量)和 IPC。

单线程时间:0.32s

多进程时间:0.53s

最佳答案

实际上,您的示例中有一个重要的共享资源,即监视器(或 stdout)。

print 是一个相对较慢的操作(与 CPU 周期相比......),并且它会导致进程之间的争用。

正确地对并行工作进行基准测试是一项艰巨的任务,它受到 CPU 的许多因素和特性(例如缓存)的影响。

尝试将您的工作负载替换为非常适合多重处理的工作负载(例如,在数组的不同部分上并行工作、矩阵乘法...)

还有一件更重要的事情:产生新进程也需要时间,并且要想让每个进程中完成的工作得到返回,就需要大量的时间。如果稍微增加循环的范围,差异应该有利于多进程版本:

import time
from multiprocessing import Process

def foobar(a):
for i in range(1,10000000):
a*i
return

if __name__ == "__main__":
Tthreading = time.time()
p1= Process(target= foobar, args=(3,))
p2 = Process(target= foobar, args= (2,))
p3 = Process(target= foobar, args= (4,))
p4 = Process(target=foobar, args=(123,))

allprocess = [p1,p2,p3,p4]
for p in allprocess:
p.start()

for p in allprocess:
p.join()

print(time.time() - Tthreading)

#Single-threaded
Tsingle = time.time()
foobar(3)
foobar(2)
foobar(4)
foobar(123)
print(time.time() - Tsingle)

在我的机器上输出:

0.44509196281433105

1.3775699138641357

关于Python 多处理代码运行速度比单线程代码慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56372799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com