python中的多线程模块比多处理慢
我发现对于同一个任务,线程模块比多重处理花费更多的时间python中的多线程模块比多处理慢,python,multithreading,algorithm,parallel-processing,multiprocessing,Python,Multithreading,Algorithm,Parallel Processing,Multiprocessing,我发现对于同一个任务,线程模块比多重处理花费更多的时间 import time import threading import multiprocessing def func(): result = 0 for i in xrange(10**8): result += i num_jobs = 10 # 1. measure, how long it takes 10 consistent func() executions t = time.tim
import time
import threading
import multiprocessing
def func():
result = 0
for i in xrange(10**8):
result += i
num_jobs = 10
# 1. measure, how long it takes 10 consistent func() executions
t = time.time()
for _ in xrange(num_jobs):
func()
print ("10 consistent func executions takes:\n{:.2f} seconds\n".format(time.time() - t))
# 2. threading module, 10 jobs
jobs = []
for _ in xrange(num_jobs):
jobs.append(threading.Thread(target = func, args=()))
t = time.time()
for job in jobs:
job.start()
for job in jobs:
job.join()
print ("10 func executions in parallel (threading module) takes:\n{:.2f} seconds\n".format(time.time() - t))
# 3. multiprocessing module, 10 jobs
jobs = []
for _ in xrange(num_jobs):
jobs.append(multiprocessing.Process(target = func, args=()))
t = time.time()
for job in jobs:
job.start()
for job in jobs:
job.join()
print ("10 func executions in parallel (multiprocessing module) takes:\n{:.2f} seconds\n".format(time.time() - t))
结果:
10个一致的func执行需要:
25.66秒
并行线程模块中的10个func执行需要:
46秒
并行多处理模块中的10个func执行需要:
7.92秒
1为什么使用多处理模块的实现比使用线程模块的实现效果更好
2为什么一致的func执行比使用线程模块花费更少的时间?您的两个问题都可以通过以下摘录得到答案: CPython解释器使用的机制,用于确保一次只有一个线程执行Python字节码。通过使包含关键内置类型(如dict)的对象模型对并发访问具有隐式安全性,从而简化了CPython实现。锁定整个解释器使解释器更容易成为多线程的解释器,而牺牲了多处理器机器提供的大部分并行性 我的。最后,您将花费大量时间在线程之间切换,以确保它们都运行到完成。这就像把一根绳子切成小块,然后再把它们绑在一起,一次一根绳子
由于每个进程都在自己的地址空间中执行,因此使用多处理模块的结果与预期一致。除了位于同一进程组和具有相同的父进程之外,这些进程彼此独立。@AnthonySottile,谢谢,但我的问题要宽泛一点——你的链接问题其实不是——这个问题和几个答案都详细说明了,由于全局解释器锁,对于cpu限制的操作,线程通常会变慢,而且多处理和线程都会有一些启动成本。在这种情况下,线程速度如此缓慢的原因是由于GIL和上下文切换。