多个线程干同一件事 VS 一个线程干一件事
2 个线程算 2 个斐波那契 VS 1 个线程算 2 个斐波那契,没想到居然后者更快一些,原来 python 中的线程不适合计算密集型。
原因:https://www.dabeaz.com/usenix2009/concurrent/Concurrent.pdf
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from threading import Thread
import time
import datetime
def febo(n):
if n <= 2:
return n
return febo(n-1) + febo(n-2)
def print_time():
time_stamp = datetime.datetime.now()
print (time_stamp.strftime('%Y.%m.%d-%H:%M:%S'))
class EThread(Thread):
def __init__(self, n):
super(EThread, self).__init__()
self.n = n
def run(self):
febo(self.n)
class EThread2(Thread):
def __init__(self, n):
super(EThread2, self).__init__()
self.n = n
def run(self):
febo(self.n)
febo(self.n)
n = 35
def main():
print_time()
w = EThread(n)
w1 = EThread(n)
w.start()
w1.start()
w.join()
w1.join()
print_time()
print("------------")
print_time()
ww = EThread2(n)
ww.start()
ww.join()
print_time()
main()
结果:
2019.12.19-17:39:00
2019.12.19-17:39:04
------------
2019.12.19-17:39:04
2019.12.19-17:39:07
多个进程干同一件事 VS 一个进程干一件事
前者更快一些。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from multiprocessing import Process
import time
import datetime
def febo(n):
if n <= 2:
return n
return febo(n-1) + febo(n-2)
def print_time():
time_stamp = datetime.datetime.now()
print (time_stamp.strftime('%Y.%m.%d-%H:%M:%S'))
class EProcess(Process):
def __init__(self, n):
super(EProcess, self).__init__()
self.n = n
def run(self):
febo(self.n)
class E2(Process):
def __init__(self, n):
super(EProcess2, self).__init__()
self.n = n
def run(self):
febo(self.n)
febo(self.n)
n = 38
def main():
print_time()
w = EProcess(n)
w1 = EProcess(n)
w.start()
w1.start()
w.join()
w1.join()
print_time()
print("------------")
print_time()
ww = EProcess2(n)
ww.start()
ww.join()
print_time()
main()
结果:
2019.12.19-17:46:05
2019.12.19-17:46:11
------------
2019.12.19-17:46:11
2019.12.19-17:46:23
别的例子
https://www.dabeaz.com/usenix2009/concurrent/Concurrent.pdf
原因: