Python 性能優化:從入門到精通的實用指南

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 幫你量化優化效果。

希望你看完能有所收獲,趕緊把這些技巧用到自己的代碼里吧!有什么問題,隨時問我哦~


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71582.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71582.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71582.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用 requestrepo 工具驗證 XML外部實體注入漏洞

1. 前言 在數字化浪潮席卷的當下&#xff0c;網絡安全的重要性愈發凸顯。應用程序在便捷生活與工作的同時&#xff0c;也可能暗藏安全風險。XXE&#xff08;XML外部實體&#xff09;漏洞作為其中的典型代表&#xff0c;攻擊者一旦利用它&#xff0c;便能竊取敏感信息、掌控服務…

FreeRTOS第17篇:FreeRTOS鏈表實現細節05_MiniListItem_t:FreeRTOS內存優化

文/指尖動聽知識庫-星愿 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:深入FreeRTOS內核:從原理到實戰的嵌入式開發指南 1 為什么需要迷你列表項? 在嵌入式系統中,內存資源極其寶貴。FreeRTOS為滿足不同場景需求,設計了標準列表項(ListItem_…

Spring 無法解決循環依賴的 5 種場景

一、構造器注入引發的循環依賴 1. 問題復現 Component public class ServiceA {private final ServiceB serviceB;Autowiredpublic ServiceA(ServiceB serviceB) { // 構造器注入this.serviceB serviceB;} }Component public class ServiceB {private final ServiceA servic…

Core Vision Kit(基礎視覺服務)

文章目錄 一、Core Vision Kit簡介場景介紹約束與限制二、通用文字識別三、人臉檢測一、Core Vision Kit簡介 Core Vision Kit(基礎視覺服務)是機器視覺相關的基礎能力,例如通用文字識別(即OCR,Optical Character Recognition,也稱為光學字符識別)、人臉檢測、人臉比對…

第TR3周:Pytorch復現Transformer

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 Transformer通過自注意力機制&#xff0c;改變了序列建模的方式&#xff0c;成為AI領域的基礎架構 編碼器&#xff1a;理解輸入&#xff0c;提取上下文特征…

FreeRTOS 任務間通信機制:隊列、信號量、事件標志組詳解與實驗

1. FreeRTOS 消息隊列 1.1 簡介 ? 隊列是 任務間通信的主要形式&#xff0c;可用于在任務之間以及中斷與任務之間傳遞消息。隊列在 FreeRTOS 中具有以下關鍵特點&#xff1a; 隊列默認采用 先進先出 FIFO 方式&#xff0c;也可以使用 xQueueSendToFront()實現 LIFO。FreeRT…

【虛擬化】Docker Desktop 架構簡介

在閱讀前您需要了解 docker 架構&#xff1a;Docker architecture WSL 技術&#xff1a;什么是 WSL 2 1.Hyper-V backend 我們知道&#xff0c;Docker Desktop 最開始的架構的后端是采用的 Hyper-V。 Docker daemon (dockerd) 運行在一個 Linux distro (LinuxKit build) 中&…

Unity光照之Halo組件

簡介 Halo 組件 是一種用于在游戲中創建光暈效果的工具&#xff0c;主要用于模擬光源周圍的發光區域&#xff08;如太陽、燈泡等&#xff09;或物體表面的光線反射擴散效果。 核心功能 1.光暈生成 Halo 組件會在光源或物體的周圍生成一個圓形光暈&#xff0c;模擬光線在空氣…

Flink深入淺出之01:應用場景、基本架構、部署模式

Flink 1?? 一 、知識要點 &#x1f4d6; 1. Flink簡介 Apache Flink — Stateful Computations over Data StreamsApache Flink 是一個分布式大數據處理引擎&#xff0c;可對有界數據流和無界數據流進行有狀態的計算。Flink 能在所有常見集群環境中運行&#xff0c;并能以…

2025年【高壓電工】報名考試及高壓電工考試總結

隨著電力行業的快速發展&#xff0c;高壓電工成為確保電力系統安全穩定運行的重要一環。為了提高高壓電工的專業技能和安全意識&#xff0c;“安全生產模擬考試一點通”平臺特別整理了2025年高壓電工報名考試的相關信息及考試總結&#xff0c;并提供了一套完整的題庫&#xff0…

網絡HTTP

HTTP Network Request Library A Retrofit-based HTTP network request encapsulation library that provides simple and easy-to-use API interfaces with complete network request functionality. 基于Retrofit的HTTP網絡請求封裝庫&#xff0c;提供簡單易用的API接口和完…

os-copilot安裝和使用體驗測評

簡介&#xff1a; OS Copilot是阿里云基于大模型構建的Linux系統智能助手&#xff0c;支持自然語言問答、命令執行和系統運維調優。本文介紹其產品優勢、功能及使用方法&#xff0c;并分享個人開發者在云服務器資源管理中的實際應用體驗。通過-t/-f/管道功能&#xff0c;OS Cop…

Python Flask框架學習匯編

1、入門級&#xff1a; 《Python Flask Web 框架入門》 這篇博文條理清晰&#xff0c;由簡入繁&#xff0c;案例豐富&#xff0c;分十五節詳細講解了Flask框架&#xff0c;強烈推薦&#xff01; 《python的簡單web框架flask【附例子】》 講解的特別清楚&#xff0c;每一步都…

【HarmonyOS Next之旅】DevEco Studio使用指南(一)

目錄 1 -> 工具簡介 1.1 -> 概述 1.2 -> HarmonyOS應用/服務開發流程 1.2.1 -> 開發準備 1.2.2 -> 開發應用/服務 1.2.3 -> 運行、調試和測試應用/服務 1.2.4 -> 發布應用/服務 2 -> 工程介紹 2.1 -> APP包結構 2.2 -> 切換工程視圖 …

Manus開源平替-開源通用智能體

原文鏈接:https://i68.ltd/notes/posts/250306-opensource-agi-agent/ OWL-比Manus還強的全能開源Agent OWL: Optimized Workforce Learning for General Multi-Agent Assistance in Real-World Task Automation&#xff0c;現實世界中執行自動化任務的通用多代理輔助優化學習…

【3.2-3.8學習周報】

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 摘要Abstract一、方法介紹1.任務適應性持續預訓練&#xff08;TACP&#xff09;2.領域自適應連續預訓練&#xff08;DACP&#xff09;3.ETS-DACP和ETA-DACP 二、實驗…

【Linux】用戶和組

思考 使用useradd在Linux下面創建一個用戶&#xff0c;默認情況下&#xff0c;會自動創建一個同名組&#xff0c;并且加入其中&#xff0c;那么是先創建用戶呢&#xff1f;還是先創建組呢&#xff1f; 很簡單&#xff0c;我們實踐一下不就知道了&#xff0c;如下所示&#xff…

新編大學應用英語綜合教程2 U校園全套參考答案

全套答案獲取&#xff1a; 鏈接&#xff1a;https://pan.quark.cn/s/389618f53143

SAP 顧問的五年職業規劃

SAP 顧問的職業發展受到技術進步、企業需求變化和全球經濟環境的影響&#xff0c;因此制定長遠規劃充滿挑戰。面對 SAP 產品路線圖的不確定性&#xff0c;如向 S/4HANA 和 Business Technology Platform (BTP) 的轉變&#xff0c;顧問必須具備靈活性&#xff0c;以保持競爭力和…

圖像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image

圖像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image 文章目錄 圖像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image主要創新點模型架構圖生成器生成器源碼 判別器判別器源碼 損失函數需要源碼講解的私信我 S…