Python生成器:高效處理大數據的秘密武器

生成器概述

生成器是 Python 中的一種特殊迭代器,通過普通函數的語法實現,但使用 yield 語句返回數據。生成器自動實現了 __iter__()__next__() 方法,因此可以直接用于迭代。生成器的核心特點是延遲計算(lazy evaluation),即只在需要時生成下一個值,而不是一次性計算并存儲所有值。

生成器的作用與優勢

作用:

  • 節省內存空間
  • 按需生成數據項
  • 支持無限序列生成
  • 簡化復雜迭代邏輯的代碼

優勢:

  • 內存效率高,適用于大數據集
  • 可以創建惰性求值的數據流
  • 代碼結構更加簡潔易讀

生成器的使用場景

場景描述
處理大數據集當數據量非常大以至于無法全部加載到內存中時,生成器可以逐個生成數據項
創建無限序列如自然數列、斐波那契數列等理論上沒有終點的數據流
簡化代碼結構在某些情況下,使用生成器可以讓代碼更加簡潔、易維護

生成器表達式 vs 列表推導式

類型語法是否立即執行示例特點
列表推導式使用方括號 []? 是[i * 5 for i in range(5)]立即計算結果并保存在內存中
生成器表達式使用圓括號 ()? 否(i * 5 for i in range(5))延遲計算,每次迭代才會生成一個值

示例代碼:

li = [i * 5 for i in range(5)]
print(li)  # 輸出: [0, 5, 10, 15, 20]gen = (i * 5 for i in range(5))
print(gen)  # 輸出: <generator object ...>
print(gen.__next__())  # 輸出: 0

生成器函數:yield 的作用

帶有 yield 關鍵字的函數稱為生成器函數。它不像普通函數那樣返回一個值后就結束,而是可以在多個調用之間“暫停”和“恢復”。類似于中斷函數。

yield 的特點:

  • 每次調用 next() 會從上次 yield 的位置繼續執行
  • 保留函數的狀態
  • 返回值不會被一次性計算出來,而是按需生成

示例代碼:

def test():yield 'a'yield 'b'yield 'c'gen = test()
print(gen.__next__())  # 輸出: a
print(gen.__next__())  # 輸出: b
print(gen.__next__())  # 輸出: c

可迭代對象、迭代器、生成器三者關系

名稱定義特點
可迭代對象(Iterable)實現了 __iter__() 方法的對象可以用 for...in 遍歷,如 liststrdict、迭代器、生成器
迭代器(Iterator)實現了 __next__() 方法的對象可以使用 next() 獲取下一個元素
生成器(Generator)一種特殊的迭代器,由 yield 函數或生成器表達式產生自動實現 __iter__()__next__()

三者關系圖示:

  • 可迭代對象包含迭代器迭代器包含生成器
可迭代對象 ? 迭代器 ? 生成器

實戰對比:列表 vs 生成器處理大數據

比較兩種方式處理一千萬個數字(0~9999999),并對每個數字進行平方操作。

使用模塊:

  • time:用于計時
  • sys:用于查看內存占用

代碼如下:

import time
import sys# 方法一:使用列表
def use_list():start_time = time.time()numbers = [i for i in range(10_000_000)]  # 生成列表squares = [x * x for x in numbers]         # 計算平方end_time = time.time()print(f"【列表】耗時: {end_time - start_time:.4f} 秒")print(f"【列表】占用內存: {sys.getsizeof(numbers) + sys.getsizeof(squares)} 字節")# 方法二:使用生成器
def number_generator(n):for i in range(n):yield idef use_generator():start_time = time.time()gen = number_generator(10_000_000)squares = (x * x for x in gen)  # 生成器表達式,不會立即計算count = 0for square in squares:count += 1  # 強制執行生成器end_time = time.time()print(f"【生成器】耗時: {end_time - start_time:.4f} 秒")print(f"【生成器】生成器對象本身占用內存: {sys.getsizeof(gen)} 字節")# 運行測試
print("=== 開始測試 ===\n")
use_list()
print("\n------------------------\n")
use_generator()
print("\n=== 測試結束 ===")

結果分析(根據機器性能不同,數值可能略有差異):

指標列表方式生成器方式
內存占用非常大(約 184MB)極小(約 112B)
耗時略快略慢
是否適合大數據? 不適合? 非常適合

總結

生成器是一種強大而高效的工具,特別適用于:

  • 數據量龐大的場景
  • 需要延遲加載的場景
  • 需要節省內存的場景
  • 需要簡化復雜迭代邏輯的場景

雖然生成器在速度上略遜于列表,但它在內存使用上的優勢使其成為處理大規模數據的首選方式。

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

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

相關文章

Flask框架入門與實踐

Flask框架入門與實踐 Flask是一個輕量級的Python Web框架&#xff0c;以其簡潔、靈活和易于上手的特點深受開發者喜愛。本文將帶您深入了解Flask的核心概念、基本用法以及實際應用。 什么是Flask&#xff1f; Flask是由Armin Ronacher于2010年開發的微型Web框架。與Django等…

數學復習筆記 14

前言 和家里人交流了一下&#xff0c;他們還是希望我全力以赴初試&#xff0c;我確實也得放開了干&#xff0c;不要束手束腳的。好好加油。感覺公共課都沒有啥壓力&#xff0c;主要是專業課要好好加油&#xff0c;真不能過不了線&#xff0c;要是過不了線&#xff0c;啥都白搭…

金格iWebOffice控件在新版谷歌Chrome中不能加載了怎么辦?

金格iWebOffice控件是由江西金格網絡科技有限責任公司開發的中間件軟件&#xff0c;主要用于在瀏覽器中直接編輯Word、Excel、PowerPoint等Office文檔&#xff0c;曾經是一款優秀國產的WebOffice插件。 由于2022年Chrome等瀏覽器取消支持PPAPI接口&#xff0c;導致這款金格iWe…

ChatGPT 能“記住上文”的原因

原因如下 你把對話歷史傳給了它 每次調用 OpenAI 接口時&#xff0c;都會把之前的對話作為參數傳入&#xff08;messages 列表&#xff09;&#xff0c;模型“看見”了之前你說了什么。 它沒有長期記憶 它不會自動記住你是誰或你說過什么&#xff0c;除非你手動保存歷史并再次…

微信小程序van-dialog確認驗證失敗時阻止對話框的關閉

使用官方(Vant Weapp - 輕量、可靠的小程序 UI 組件庫)的before-close&#xff1a; wxml&#xff1a; <van-dialog use-slot title"名稱" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…

K8S Ingress、IngressController 快速開始

假設有如下三個節點的 K8S 集群&#xff1a; ? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、理論介紹 1&#xff09;什么是 Ingress 定義&#xff1a;Ingress 是 Kubernetes 中的一種資源對象&#xff0c;它定義了外部訪問集群內…

Vue3 + Element Plus 動態表單實現

完整代碼 <template><div class"dynamic-form-container"><el-formref"dynamicFormRef":model"formData":rules"formRules"label-width"auto"label-position"top"v-loading"loading"&g…

Mac修改hosts文件方法

Mac修改hosts文件方法 在 macOS 上修改 hosts 文件需要管理員權限 步驟 1&#xff1a;打開終端 通過 Spotlight 搜索&#xff08;Command 空格&#xff09;輸入 Terminal&#xff0c;回車打開。或進入 應用程序 > 實用工具 > 終端。 步驟 2&#xff1a;備份 hosts 文件…

深度學習—BP神經網絡

文章目錄 [TOC](文章目錄) 一、基本概念二、 網絡結構三、BP神經網絡的原理總結特點&#xff1a;應用場景優缺點 一、基本概念 BP 神經網絡&#xff08;Backpropagation Neural Network&#xff09;是一種基于誤差反向傳播算法的多層前饋神經網絡&#xff0c;由輸入層、隱藏層…

Spring AI(6)——向量存儲

向量數據庫是一種特殊類型的數據庫&#xff0c;在 AI 應用中發揮著至關重要的作用。 在向量數據庫中&#xff0c;查詢與傳統關系型數據庫不同。它們執行的是相似性搜索&#xff0c;而非精確匹配。當給定一個向量作為查詢時&#xff0c;向量數據庫會返回與該查詢向量“相似”的…

Qt功能區:簡介與安裝

Qt功能區 1. 功能區簡介2. SARibbon2.1 簡介2.2 編譯與安裝采用CMake-gui進行編譯采用VS進行編譯安裝與使用 Qt 官方不支持 Ribbon 風格&#xff08;Ribbon UI 風格是微軟開創的&#xff0c;具有專利許可協議&#xff0c;許可協議對從構建 UI 的指令到每個按鈕間的空格數都做了…

iOS safari和android chrome開啟網頁調試與檢查器的方法

手機開啟遠程調試教程&#xff08;適用于 Chrome / Safari&#xff09; 前端移動端調試指南&#xff5c;適用 iPhone 和 Android&#xff5c;WebDebugX 出品 本教程將詳細介紹如何在 iPhone 和 Android 手機上開啟網頁檢查器&#xff0c;配合 WebDebugX 實現遠程調試。教程包含…

Golang企業級商城高并發微服務實戰

Golang企業級商城高并發微服務實戰包含內容介紹&#xff1a; 從零開始講了百萬級單體高并發架構、千萬級微服務架構&#xff0c;其中包含Rpc實現微服務、微服務的跨語言調用jsonrpc和protobuf、protobuf的安裝、protobuf高級語法、protobuf結合Grpc實現微服務實戰、微服務服務…

實現可靠的 WebSocket 連接:心跳與自動重連的最佳實踐

概覽 本文將手把手教你如何從零編寫一個可用于直播或在線聊天的 WSocket 類&#xff0c;依次實現連接建立、心跳檢測、斷線重連、消息收發以及資源清理等功能。我們將結合 WebSocket API 的標準用法、心跳保持 和 重連策略&#xff0c;并充分運用現代 JavaScript 語法&#xf…

UEFI Spec 學習筆記---33 - Human Interface Infrastructure Overview(1)

33 - Human Interface Infrastructure Overview 本章節主要用于介紹Human Interface Infrastructure&#xff08;HII&#xff09;架構介紹&#xff0c;描述如何通過 HII 來管理用戶的輸入&#xff0c;以及描述在 UEFI spec 中涉及 HII 相關的 Protocol、function 和類型定義。…

ip命令詳解

控制網卡的硬件狀態 ip link set ens36 down ip link set ens36 up 修改網卡名稱&#xff08;臨時&#xff09; ip link set ens36 down ip link set ens36 name xxx 修改網卡的mac地址 ip link set ens36 down ip link set xxx name ens36 查看ip的addr ip addr show ip ad…

hadoop中了解yarm

Hadoop中的YARN&#xff08;Yet Another Resource Negotiator&#xff09;是一種新的Hadoop資源管理器&#xff0c;是一個通用資源管理系統&#xff0c;可為上層應用提供統一的資源管理和調度。以下是其相關介紹&#xff1a; 核心思想 將JobTracker的資源管理和作業調度/監控功…

做好的QT軟件,換一個筆記本打開后發現字體很小,部分字體還被控件遮擋

出現這種情況的原因主要是屏幕的DPI&#xff08;每英寸點數&#xff09;不同。Qt中控件的大小單位為像素&#xff0c;在高DPI下&#xff0c;控件會變小&#xff0c;低DPI下控件會變大。而Qt中字體的單位默認為磅&#xff0c;無論在什么顯示器上顯示同一磅值的字體&#xff0c;其…

linux - 權限的概念

目錄 用戶權限 超級用戶與普通用戶的區別 超級用戶&#xff08;root&#xff09;&#xff1a; 普通用戶&#xff1a; 切換用戶身份 使用sudo執行高權限命令 用戶管理 用戶組管理 文件權限 文件訪問者類別 基本權限 權限表示方法 權限修改 chmod chown chgrp u…

Python函數返回值的藝術:為何True/False是更優實踐及例外情況分析

在Python編程實踐中&#xff0c;子程序的返回值設計往往是一個容易被忽視但卻至關重要的設計決策。本文將深入探討為什么返回True/False往往是更好的選擇&#xff0c;何時應該避免這種做法&#xff0c;以及如何處理與None值相關的問題。 為什么返回True/False是更好的實踐&…