摘要
尝试使用Python多进程来加快运算
参考资料:http://python.jobbole.com/82045/
TIPS:
(1) CPU 密集运算才用多进程
(2) I/O 密集运算用多线程
斐波那契数列
斐波那契数列的计算属于纯计算型的问题,无IO等额外时间的开销
import multiprocessing
import time
# 计算第n个Fibonacci数[O(n)]
def fibonacci(num=10):
s1=1
s2=1
for _ in range(num-2):
temp = s1+s2
s1 = s2
s2 = temp
return s2
def callback(object):
print(object)
def mp_fibonacci():
pool = multiprocessing.Pool(processes=3)
result1 = pool.apply_async(fibonacci, (33,), callback=callback)
result2 = pool.apply_async(fibonacci, (43,), callback=callback)
result3 = pool.apply_async(fibonacci, (53,), callback=callback)
result4 = pool.apply_async(fibonacci, (63,), callback=callback)
result5 = pool.apply_async(fibonacci, (73,), callback=callback)
print("Processing Pool Initiated!")
pool.close()
pool.join() # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
print("Processing Pool Terminated!")
def get_fibonacci():
print(fibonacci(33))
print(fibonacci(43))
print(fibonacci(53))
print(fibonacci(63))
print(fibonacci(73))
if __name__ == "__main__":
start_t = time.time()
mp_fibonacci()
print("Finished in",time.time()-start_t)
start_t = time.time()
get_fibonacci()
print("Finished in", time.time() - start_t)
然后我们惊奇地发现,用进程池好像还慢些,gg思密达 )T.T)
看来,除非真的是大规模的运算,进程池调度的花销远比直接单线程高
Processing Pool Initiated! 3524578 433494437 6557470319842 806515533049393 53316291173 Processing Pool Terminated! Finished in 0.19844412803649902 3524578 433494437 53316291173 6557470319842 806515533049393 Finished in 9.393692016601562e-05