一、使用多線程/多進程
Python中的GIL(全局解釋器鎖)限制了線程的並行執行,但是多線程/多進程會在多核CPU上提高程序的並行性能。可以通過Python自帶的threading或multiprocessing庫來實現。以下是一個簡單的使用multiprocessing庫的例子:
import multiprocessing
def worker(num):
print('Worker: %s' % num)
return
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
上面的代碼創建了5個進程,每個進程都會執行worker函數。可以看到,多進程的執行速度比單進程要快。
二、使用緩存
Python中的緩存可以減少程序運行時重複計算的情況。比如,可以將經常用到的計算結果保存到一個字典中,每次需要用到時就直接從字典中取值。
cache_dict = {}
def fib(n):
if n in cache_dict:
return cache_dict[n]
if n < 2:
return n
res = fib(n-1) + fib(n-2)
cache_dict[n] = res
return res
在上面的代碼中,我們定義了一個cache_dict字典,用於保存已經計算過的Fibonacci數列項。每次計算Fibonacci數列的第 n 項時,都會先檢查該項是否在cache_dict中,如果在,則直接返回對應的值;否則計算並保存到cache_dict中。這樣可以減少程序運行時的計算量,提高程序運行效率。
三、使用裝飾器
對於需要頻繁調用的函數,可以使用裝飾器來緩存計算結果,避免重複計算。示例代碼如下:
def cache(func):
cache_dict = {}
def wrapped(n):
if n not in cache_dict:
cache_dict[n] = func(n)
return cache_dict[n]
return wrapped
@cache
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
在上面的代碼中,定義了一個cache裝飾器,它會將函數的計算結果保存到一個名為cache_dict的字典中。每次調用函數時,首先檢查cache_dict中是否已經有了對應的結果,如果有則直接返回結果,否則執行函數計算,並將結果保存到cache_dict中。
四、使用NumPy和Pandas優化數組操作
Python本身的列表操作效率不如NumPy和Pandas等專業的數值計算庫。如果需要進行大量的矩陣或數組運算,建議使用NumPy和Pandas。比如,以下是一個使用NumPy計算矩陣乘法的示例:
import numpy as np
a = np.random.rand(1000, 1000)
b = np.random.rand(1000, 1000)
c = np.dot(a, b)
上面的代碼中,我們通過np.random.rand生成了兩個1000×1000的隨機數矩陣a和b。然後使用np.dot函數計算矩陣乘積c。使用NumPy進行數組操作的效率要比使用Python列表高出很多。
五、使用numba優化代碼
numba是一種可以將Python代碼JIT編譯成本機機器碼的工具,能夠顯著提高代碼的計算速度。以下是一個簡單的使用numba的示例:
from numba import jit
@jit(nopython=True)
def calc_sum(n):
s = 0
for i in range(n):
s += i
return s
result = calc_sum(1000000)
上面的代碼定義了一個calc_sum函數,用於計算1~n的整數之和。使用@jit裝飾器將該函數轉化為JIT編譯後的代碼。可以看到,使用numba可以極大地提高程序的計算速度。
六、總結
本文介紹了多線程/多進程、緩存、裝飾器、NumPy/Pandas以及numba等方式可以優化Python腳本的運行時間。在實際開發中,可以結合具體場景選擇適合的優化方案。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/246238.html