為什麼需要效能分析與優化?
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
這篇文章將從三個層面帶你掌握 Python 效能優化技巧:
- 如何找出程式中的效能瓶頸(Profiling)
- 實際的優化技巧與寫法
- 工具與進階策略(例如 Numpy 加速)
第一部分:效能分析(Profiling)-找出誰在拖慢你!
什麼是 Profiling?
效能分析(Profiling) 就像是程式的健康檢查。透過工具,我們可以知道:- 哪段程式花最多時間?
- 哪個函數被呼叫次數最多?
- 哪些資源被過度使用?
內建工具:cProfile
import cProfile
def slow_function():
total = 0
for i in range(1000000):
total += i
return total
cProfile.run('slow_function()')
結果解讀

ncalls
: 呼叫次數tottime
: 該函數本身花費的時間(不含子函數)cumtime
: 該函數加上所有子函數的總時間
進階工具:line_profiler
更精確的分析工具,可以逐行顯示哪行程式碼耗時最多。
安裝方式:
pip install line_profiler
使用方式:
@profile
def slow_function():
total = 0
for i in range(1000000):
total += i
return total
執行命令:
kernprof -l -v your_script.py
結果解讀:

第二部分:常見的 Python 優化技巧
減少不必要的運算
# 非最佳寫法
for i in range(len(arr)):
print(arr[i])
# 最佳化寫法
for val in arr:
print(val)
使用生成器代替列表
# 耗費記憶體
squares = [x*x for x in range(1000000)]
# 更省記憶體(生成器)
squares = (x*x for x in range(1000000))
使用內建函數與內建資料結構
Python 的內建函數(如 sum()
、max()
)多數是 C 寫的,比你手刻的迴圈快!
# 手刻的加總
total = 0
for x in numbers:
total += x
# 使用內建 sum 更快
total = sum(numbers)
避免重複運算
# 非最佳
for i in range(len(data)):
for j in range(len(data)):
if data[i] == data[j]:
do_something()
# 最佳化(先轉成 set 或 hash 比較)
seen = set(data)
第三部分:進階優化工具與策略
使用 NumPy 加速數值運算
NumPy 是高效的數值處理庫,可以極大地加速運算。
import numpy as np
# 用原生 Python 加總兩個向量
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = [a[i] + b[i] for i in range(len(a))]
# 用 NumPy 快很多
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
c = a + b
多工與非同步處理
如果你的應用程式有 I/O 操作(例如檔案或網路),使用 asyncio
或 threading
可以有效加速。
import asyncio
async def fetch_data():
print("開始抓資料")
await asyncio.sleep(2)
print("資料抓取完成")
asyncio.run(fetch_data())
範例實作:效能優化小專案
原始版本(暴力跑兩層迴圈):
def is_prime(n):
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
primes = [x for x in range(10000) if is_prime(x)]
優化版本(只跑到 sqrt(n) 且用 NumPy 篩選):
import math
def is_prime(n):
if n < 2:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
primes = [x for x in range(10000) if is_prime(x)]
效能提升明顯!
結語與建議
- 先寫對,再寫快,優化前,先確認邏輯正確。
- 用 Profiling 工具找瓶頸,不要盲目優化,找出最耗時的部分才是關鍵。
- 熟悉 NumPy、Pandas 等工具庫,它們往往比手刻程式更高效。
- 寫清楚的程式碼比過度優化更重要,過度追求效能可能會讓程式變難維護。