讓 Python 代碼飛起來!十個提升速度的優(yōu)化技巧
寫出能跑的代碼容易,寫出又快又優(yōu)美的代碼難。許多初學(xué)者的代碼在數(shù)據(jù)量小時看不出問題,但一旦數(shù)據(jù)變大就會龜速運(yùn)行。本文將分享10個實用的優(yōu)化技巧,讓你的Python代碼性能提升5-100倍,并展示如何測量代碼性能。

優(yōu)化前的準(zhǔn)備:性能測量
import time
import timeit
# 方法1:使用time模塊
def slow_function():
result = []
for i in range(1000000):
result.append(i ** 2)
return result
start = time.time()
result = slow_function()
end = time.time()
print(f"耗時:{end - start:.4f}秒")
# 方法2:使用timeit(更準(zhǔn)確)
execution_time = timeit.timeit(
lambda: slow_function(),
number=10# 運(yùn)行10次求平均
)
print(f"平均耗時:{execution_time / 10:.4f}秒")
# 方法3:使用%timeit(Jupyter中)
# %timeit slow_function() # 在Jupyter中運(yùn)行優(yōu)化技巧1:用列表推導(dǎo)式替代循環(huán)
? 慢速方法(0.25秒):
result = []
for i in range(1000000):
result.append(i ** 2)? 快速方法(0.08秒,快3倍):
result = [i ** 2 for i in range(1000000)]優(yōu)化技巧2:使用map()代替循環(huán)
? 慢速方法:
result = [int(x) for x in str_numbers]? 快速方法(快20%):
result = list(map(int, str_numbers))優(yōu)化技巧3:用NumPy代替Python循環(huán)
? 慢速方法(純Python循環(huán)):
result = []
for i in range(1000000):
result.append(i ** 2 + i ** 3)? 快速方法(快100倍):
import numpy as np
arr = np.arange(1000000)
result = arr ** 2 + arr ** 3優(yōu)化技巧4:避免重復(fù)計算
? 重復(fù)計算:
for i in range(len(large_list)):
print(large_list[i] * math.sqrt(2)) # 每次循環(huán)都計算sqrt(2)? 計算一次,多次使用:
sqrt_2 = math.sqrt(2)
for item in large_list:
print(item * sqrt_2)優(yōu)化技巧5:使用集合而不是列表查找
? 慢速方法(O(n)時間復(fù)雜度):
allowed = [1, 2, 3, 4, 5]
if value in allowed: # 需要遍歷整個列表
pass? 快速方法(O(1)時間復(fù)雜度,快100倍):
allowed = {1, 2, 3, 4, 5}
if value in allowed: # 直接查找,常數(shù)時間
pass優(yōu)化技巧6:使用字符串連接的正確方法
? 極慢方法(1.5秒):
result = ""
for word in words:
result = result + word + ", " # 字符串不可變,每次都創(chuàng)建新對象? 快速方法(0.001秒,快1500倍):
result = ", ".join(words)優(yōu)化技巧7:使用本地變量而不是全局變量
? 慢速方法:
global_var = 10
def slow_function():
total = 0
for i in range(1000000):
total += global_var # 每次都查找全局變量
return total? 快速方法(快5%):
def fast_function(var):
total = 0
for i in range(1000000):
total += var # 使用本地變量
return total
result = fast_function(10)優(yōu)化技巧8:使用zip()代替索引
? 慢速方法:
for i in range(len(list1)):
process(list1[i], list2[i])? 快速方法:
for item1, item2 in zip(list1, list2):
process(item1, item2)優(yōu)化技巧9:使用enumerate()代替range(len())
? 不推薦:
for i in range(len(items)):
print(i, items[i])? 推薦:
for i, item in enumerate(items):
print(i, item)優(yōu)化技巧10:使用多進(jìn)程處理CPU密集型任務(wù)
? 單進(jìn)程(慢):
def compute(n):
return sum(i**2 for i in range(n))
results = [compute(1000000) for _ in range(4)]? 多進(jìn)程(快4倍):
from multiprocessing import Pool
def compute(n):
return sum(i**2 for i in range(n))
with Pool(4) as p:
results = p.map(compute, [1000000] * 4)完整的性能對比示例
import timeit
import numpy as np
# 測試用例:計算列表平方和
# 方法1:純Python循環(huán)
def method1():
total = 0
for i in range(1000000):
total += i ** 2
return total
# 方法2:列表推導(dǎo)式
def method2():
return sum([i ** 2for i in range(1000000)])
# 方法3:NumPy
def method3():
arr = np.arange(1000000)
return np.sum(arr ** 2)
# 測試性能
print("性能對比:")
print(f"純Python循環(huán):{timeit.timeit(method1, number=10) / 10:.6f}秒")
print(f"列表推導(dǎo)式:{timeit.timeit(method2, number=10) / 10:.6f}秒")
print(f"NumPy:{timeit.timeit(method3, number=10) / 10:.6f}秒")
# 結(jié)果示例:
# 純Python循環(huán):0.039382秒
# 列表推導(dǎo)式:0.024578秒 (快40%)
# NumPy:0.001234秒 (快30倍)優(yōu)化的最佳實踐
# 1. 先確保代碼正確,再優(yōu)化
# 2. 用工具測量性能,不靠猜測
# 3. 優(yōu)先優(yōu)化最耗時的部分(80/20法則)
# 4. 考慮使用專業(yè)庫(NumPy、Pandas、SciPy)
# 5. 在簡潔和速度之間取得平衡
# 使用cProfile找出最耗時的函數(shù)
import cProfile
def complex_function():
# 復(fù)雜的代碼...
pass
cProfile.run('complex_function()')優(yōu)化Python代碼的關(guān)鍵在于理解哪些操作快,哪些慢。列表推導(dǎo)式、NumPy向量化操作、適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)選擇(列表vs集合)都能顯著提升性能。
































