Langchain系列文章目錄
01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南
02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋
03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南
04-玩轉 LangChain:從文檔加載到高效問答系統構建的全程實戰
05-玩轉 LangChain:深度評估問答系統的三種高效方法(示例生成、手動評估與LLM輔助評估)
06-從 0 到 1 掌握 LangChain Agents:自定義工具 + LLM 打造智能工作流!
python系列文章目錄
01-Python 基礎語法入門:從變量到輸入輸出,零基礎也能學會!
02-Python 流程控制終極指南:if-else 和 for-while深度解析
03-Python 列表與元組全攻略:從新手到高手的必備指南
04-Python 字典與集合:從入門到精通的全面解析
05-Python函數入門指南:從定義到應用
06-Python 函數高級特性:從默認參數到閉包的全面解析
07-Python 模塊與包:從零到自定義的全面指南
08-Python異常處理:從入門到精通的實用指南
09-Python 文件操作:從零基礎到日志記錄實戰
10-Python面向對象編程入門:從類與對象到方法與屬性
11-Python類的方法與屬性:從入門到進階的全面解析
12-Python繼承與多態:提升代碼復用與靈活性的關鍵技術
13-掌握Python魔法方法:如何用__add__和__len__自定義類的行為
14-python面向對象編程總結:從基礎到進階的 OOP 核心思想與設計技巧
15-掌握 Python 高級特性:深入理解迭代器與生成器
16-用 Python 裝飾器提升效率:日志與權限驗證案例
17-再也不怕資源泄漏!Python 上下文管理器,with語句全攻略
18-Python 標準庫必備模塊:math、random、os、json 全解析
19-Python 性能優化:從入門到精通的實用指南
文章目錄
- Langchain系列文章目錄
- python系列文章目錄
- 前言
- 一、影響 Python 性能的因素
- 1.1 時間復雜度
- 1.1.1 為什么時間復雜度重要?
- 1.1.2 怎么優化時間復雜度?
- 1.2 空間復雜度
- 1.2.1 空間復雜度為啥關鍵?
- 1.2.2 怎么優化空間復雜度?
- 二、Python 性能優化技巧
- 2.1 避免重復計算
- 2.1.1 使用緩存機制
- 2.1.2 預計算和惰性計算
- 2.2 減少 IO 操作
- 2.2.1 批量處理數據
- 2.2.2 使用異步 IO
- 三、使用 `timeit` 模塊測量代碼性能
- 3.1 `timeit` 模塊簡介
- 3.1.1 為什么用 `timeit`?
- 3.2 如何使用 `timeit` 測量代碼性能
- 3.2.1 命令行使用 `timeit`
- 3.2.2 在代碼中使用 `timeit`
- 四、總結
前言
Hey,你有沒有遇到過這樣的情況:代碼跑得太慢,CPU 風扇狂轉,甚至內存直接爆滿?在 Python 開發中,性能問題是個繞不過去的坎兒。無論是處理大數據、寫爬蟲,還是開發 Web 應用,優化性能都能讓你的程序更快、更省資源。這篇文章的目標很簡單:帶你從零開始,搞懂影響 Python 性能的因素,學會幾個超實用的優化技巧,還要教你怎么用 timeit
模塊測測代碼到底有多快。不管你是剛入門的小白,還是有點經驗的開發者,這里都有干貨等著你!
本文會聊三大塊:
- 影響 Python 性能的“幕后黑手”:時間復雜度和空間復雜度。
- 優化代碼的“錦囊妙計”:避免重復計算、減少 IO 操作。
- 性能檢測的“秘密武器”:
timeit
模塊。
準備好了嗎?咱們這就開始!
一、影響 Python 性能的因素
性能優化得先知道問題出在哪兒,對吧?Python 雖然簡單好用,但有些地方不注意就會拖慢速度。這部分咱們聊聊兩個核心因素:時間復雜度和空間復雜度。
1.1 時間復雜度
時間復雜度聽起來有點學術,其實就是“你的代碼跑起來需要多久”。它跟數據量大小直接掛鉤,數據越多,影響越明顯。
1.1.1 為什么時間復雜度重要?
簡單說,時間復雜度決定了一個算法的效率。比如你在列表里找個數,數據量小還好,可要是列表里有幾百萬條數據,效率低的算法能讓你等到懷疑人生。
- 舉個例子:用列表和集合找數字的區別。
# 列表找數字,時間復雜度 O(n) my_list = [1, 2, 3, 4, 5] if 3 in my_list: # 得一個個檢查print("找到啦!")# 集合找數字,時間復雜度 O(1) my_set = {1, 2, 3, 4, 5} if 3 in my_set: # 直接定位,超快print("找到啦!")
- 關鍵點:列表是線性查找,時間復雜度是 O(n);集合用哈希表,平均時間復雜度是 O(1)。數據量越大,差距越明顯。
1.1.2 怎么優化時間復雜度?
- 建議:需要頻繁查找時,用集合(
set
)或字典(dict
)代替列表。 - 場景:比如去重、查重這種操作,集合簡直是神器。
1.2 空間復雜度
時間跑得快還不夠,內存用得少也很重要。空間復雜度就是“你的代碼占了多少內存”。
1.2.1 空間復雜度為啥關鍵?
Python 自動管理內存,但用錯了數據結構,內存照樣吃緊。比如存一堆數字,用列表和生成器差別可不小。
- 舉個例子:
# 列表存一百萬個數,全都加載到內存 my_list = [i for i in range(1000000)] # 內存占用大# 生成器,邊用邊生成,內存幾乎不占 my_gen = (i for i in range(1000000)) # 超省空間
- 關鍵點:列表把所有數據都存下來,空間復雜度 O(n);生成器只存當前值,空間復雜度接近 O(1)。
1.2.2 怎么優化空間復雜度?
- 建議:大數據場景下,優先用生成器或迭代器。
- 場景:比如讀取大文件、處理流數據,用生成器能省下不少內存。
二、Python 性能優化技巧
知道了影響性能的因素,咱們得動手優化代碼。這部分分享兩個超實用的技巧:避免重復計算和減少 IO 操作。
2.1 避免重復計算
重復計算就像你炒菜時把同一個蔥花切了十遍,太浪費時間!Python 里有些操作可以提前做好,省下不少力氣。
2.1.1 使用緩存機制
緩存就是把算過的結果存起來,下次直接拿來用。Python 自帶一個神器:functools.lru_cache
。
- 代碼示例:優化遞歸計算斐波那契數列。
from functools import lru_cache@lru_cache(maxsize=128) # 緩存最多 128 個結果 def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(50)) # 超快!
- 關鍵點:沒緩存時,遞歸會重復算好多次;加了緩存,直接查表,時間從“天文數字”變成“秒級”。
- 場景:遞歸函數、頻繁調用的計算任務。
2.1.2 預計算和惰性計算
- 預計算:提前把結果算好,比如程序啟動時把常用數據準備好。
- 惰性計算:用到時再算,用生成器就是典型例子。
def lazy_range(n):i = 0while i < n:yield i # 每次只生成一個數i += 1for num in lazy_range(1000): # 按需取值print(num)
- 建議:不常用的數據用惰性計算,常用的小數據用預計算。
2.2 減少 IO 操作
IO 操作(比如讀文件、發網絡請求)特別慢,減少它的次數能讓代碼飛起來。
2.2.1 批量處理數據
別一行行讀文件,一次性讀完再處理效率更高。
- 代碼示例:
# 逐行讀,IO 次數多 def process(line):print(line)with open('file.txt', 'r') as f:for line in f: # 每次都調用 IOprocess(line)# 一次性讀,IO 次數少 with open('file.txt', 'r') as f:content = f.read() # 一次讀完lines = content.splitlines()for line in lines:process(line)
- 關鍵點:批量操作把多次 IO 變成一次,速度提升明顯。
- 場景:讀寫大文件、數據庫操作。
2.2.2 使用異步 IO
網絡請求多的時候,等一個完再發下一個太慢,用異步 IO 可以同時處理。
- 代碼示例:用
asyncio
抓網頁。import asyncio import aiohttpasync def fetch_url(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main():urls = ['http://example.com', 'http://example.org']tasks = [fetch_url(url) for url in urls]results = await asyncio.gather(*tasks)print(results[0][:100]) # 只打印前 100 個字符asyncio.run(main())
- 關鍵點:異步 IO 讓多個請求并行,特別適合爬蟲或高并發任務。
- 場景:網絡密集型任務。
三、使用 timeit
模塊測量代碼性能
優化完代碼,怎么知道效果咋樣?用 timeit
模塊測一測就知道了!
3.1 timeit
模塊簡介
timeit
是 Python 自帶的小工具,專門測小段代碼的運行時間。它會重復跑代碼取平均值,結果很靠譜。
3.1.1 為什么用 timeit
?
手動用 time.time()
測時間不準,因為系統負載會干擾。timeit
跑很多次,數據更穩定。
3.2 如何使用 timeit
測量代碼性能
3.2.1 命令行使用 timeit
直接在終端跑,適合快速測試。
- 示例:測列表推導式的速度。
python -m timeit "sum([i for i in range(1000)])"
- 輸出:類似“1000 loops, best of 5: 123 usec per loop”,表示平均每次多久。
- 建議:調試小代碼時用這個,簡單又快。
3.2.2 在代碼中使用 timeit
想在腳本里測?也很簡單。
- 代碼示例:
import timeitdef my_function():return sum([i for i in range(1000)])# 跑 100 次,測總時間 execution_time = timeit.timeit(my_function, number=100) print(f"總耗時: {execution_time} 秒")
- 關鍵點:
number
是運行次數,自己調,別設太大跑不動。 - 場景:對比不同實現方案的性能。
四、總結
本文聊了 Python 性能優化的三大塊:
- 影響因素:時間復雜度管速度,空間復雜度管內存,選對數據結構很關鍵。
- 優化技巧:避免重復計算用緩存和生成器,減少 IO 用批量和異步。
- 測量工具:
timeit
幫你量化優化效果。
希望你看完能有所收獲,趕緊把這些技巧用到自己的代碼里吧!有什么問題,隨時問我哦~