Python在不同對象中使用 in 操作符的查找效率

来源:https://www.cnblogs.com/djdjdj123/archive/2022/08/09/16566682.html
-Advertisement-
Play Games

前言 在Python中 in 操作符可以用於判斷某個元素是否存在於當前對象中,而對於不同的Python對象,使用 in 操作符的處理效率是不一樣的。 今天我們主要針對 4 種不同的Python數據類型進行學習:list列表、tuple元組、set集合、dict字典。 測試過程 我們用於測試的 4 種 ...


前言

在Python中 in 操作符可以用於判斷某個元素是否存在於當前對象中,而對於不同的Python對象,使用 in 操作符的處理效率是不一樣的。

今天我們主要針對 4 種不同的Python數據類型進行學習:list列表、tuple元組、set集合、dict字典。

測試過程

我們用於測試的 4 種Python數據類型,分別為 tmp_listtmp_tupletmp_settmp_dict,測試過程中,它們所包含的元素都是相同的,均通過 random.randint(0, num) 隨機生成,但它們的長度均為 num - 3 ,也就是說在 [0, num] 範圍內,將有3個整數不在上面的對象中,我們需要把這3個整數找出來。

測試代碼如下:

import time
import random


def demo(target, num):
    time1 = time.time()
    res = []
    for i in range(num):
        if i not in target:
            res.append(i)
    time2 = time.time()
    print("結果:{},當前類型:{},耗時:{}".format(res, type(target), time2 - time1))


num = 500
tmp_set = set()
while len(tmp_set) <= num - 3:
    tmp_set.add(random.randint(0, num))
tmp_list = list(tmp_set)
tmp_tuple = tuple(tmp_set)
tmp_dict = {key: "" for key in tmp_set}

demo(tmp_list, num)
demo(tmp_tuple, num)
demo(tmp_set, num)
demo(tmp_dict, num)

當 num = 50 時,得到如下結果:

不包含的整數:[25, 31, 36],當前類型:<class 'list'>,耗時:0.0
不包含的整數:[25, 31, 36],當前類型:<class 'tuple'>,耗時:0.0
不包含的整數:[25, 31, 36],當前類型:<class 'set'>,耗時:0.0
不包含的整數:[25, 31, 36],當前類型:<class 'dict'>,耗時:0.0

當 num = 500 時,得到如下結果:

不包含的整數:[114, 329, 355],當前類型:<class 'list'>,耗時:0.0059354305267333984
不包含的整數:[114, 329, 355],當前類型:<class 'tuple'>,耗時:0.0052182674407958984
不包含的整數:[114, 329, 355],當前類型:<class 'set'>,耗時:0.0
不包含的整數:[114, 329, 355],當前類型:<class 'dict'>,耗時:0.0

當 num = 5000 時,得到如下結果:

不包含的整數:[445, 850, 3547],當前類型:<class 'list'>,耗時:0.3342933654785156
不包含的整數:[445, 850, 3547],當前類型:<class 'tuple'>,耗時:0.39918947219848633
不包含的整數:[445, 850, 3547],當前類型:<class 'set'>,耗時:0.00099945068359375
不包含的整數:[445, 850, 3547],當前類型:<class 'dict'>,耗時:0.0

當 num = 50000 時,得到如下結果:

不包含的整數:[9296, 18652, 32281],當前類型:<class 'list'>,耗時:26.92029118537903
不包含的整數:[9296, 18652, 32281],當前類型:<class 'tuple'>,耗時:25.956974506378174
不包含的整數:[9296, 18652, 32281],當前類型:<class 'set'>,耗時:0.009968996047973633
不包含的整數:[9296, 18652, 32281],當前類型:<class 'dict'>,耗時:0.009973287582397461

當 num = 55000 時,得到如下結果:

不包含的整數:[16086, 33891, 46161],當前類型:<class 'list'>,耗時:52.91718029975891
不包含的整數:[16086, 33891, 46161],當前類型:<class 'tuple'>,耗時:52.84810948371887
不包含的整數:[16086, 33891, 46161],當前類型:<class 'set'>,耗時:0.009554624557495117
不包含的整數:[16086, 33891, 46161],當前類型:<class 'dict'>,耗時:0.007979393005371094

當 num = 75000 時,得到如下結果:

不包含的整數:[23057, 35827, 69232],當前類型:<class 'list'>,耗時:75.57932734489441
不包含的整數:[23057, 35827, 69232],當前類型:<class 'tuple'>,耗時:64.49729013442993
不包含的整數:[23057, 35827, 69232],當前類型:<class 'set'>,耗時:0.005983591079711914
不包含的整數:[23057, 35827, 69232],當前類型:<class 'dict'>,耗時:0.005979776382446289

當 num = 100000 時,得到如下結果:

'''
學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
不包含的整數:[22499, 22800, 29652],當前類型:<class 'list'>,耗時:110.19707798957825
不包含的整數:[22499, 22800, 29652],當前類型:<class 'tuple'>,耗時:109.08251285552979
不包含的整數:[22499, 22800, 29652],當前類型:<class 'set'>,耗時:0.011965036392211914
不包含的整數:[22499, 22800, 29652],當前類型:<class 'dict'>,耗時:0.009937524795532227

結論

通過上面的測試,我們可以看到,總體來說,list、tuple它們使用 in 操作符的查找效率相差不多,set、dict它們使用 in 操作符的查找效率相差不多,但隨著查找數據量的增大,list、tuple的處理效率變得越來越慢,而set、dict的處理效率,將遠遠優於list及tuple。

list列表、tuple元組、set集合、dict字典,使用 in 操作符查找的平均時間複雜度如下:

在這裡插入圖片描述
當我們在處理數據量大且需頻繁查找元素時,最好使用 set、dict ,這樣將會大幅度提升處理速度。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 統一術語(戰略設計) 我們將通過DDD完成業務與技術的完整落地 統一 領域模型術語 DDD模式名稱 技術 技術設計術語 技術術語 技術設計模式 業務 領域模型術語 DDD模式名稱 業務術語 設計無關的業務術語 清晰的事件流 DDD 領域驅動設計是一個有關軟體開發的方法論,它提出基於領域開發的開發模式 ...
  • 3、ElasticSearch搜索結果處理 3.1、排序 Elasticsearch預設是根據相關度算分(_score)來排序,但是也支持自定義方式對搜索結果排序,可以排序的欄位類型有如下幾種 keyword類型 數值類型 地理坐標類型 日期類型 ... 3.1.1、普通欄位排序 keyword、數 ...
  • @Autowired註解是spring用來支持依賴註入的核心利器之一,但是我們或多或少都會遇到required a single bean, but 2 were found(2可能是其他數字)的問題,接下來我們從源碼的角度去看為什麼會出現這個問題,以及這個問題的解法是什麼? 首先我們寫一個demo ...
  • 2、ElasticSearch高級搜索 Elasticsearch提供了基於JSON的DSL(Domain Specific Language)來定義查詢。常見的查詢類型如下所示 ①、查詢所有 查詢出所有數據,一般測試用;例如 match_all 如下圖所示 ②、全文檢索(full text)查詢 ...
  • Java多線程基礎入門 參考:b站-狂神-多線程詳解 練習與演示代碼見gitee:https://gitee.com/yuhaozhee/java-learning-record ...
  • 1.ObjectPostProcessor 使用 前面介紹了 ObjectPostProcessor的基本概念。相信讀者已經明白,所有的過濾器都由對應的配置類來負責創建,配置類在將過濾器創建成功之後,會調用父類的postProcess方法,該 方法最終會調用到CompositeObjectPostP ...
  • 0. 前言 寫完這篇文章後發現自己對於 DP 的優化一竅不通,所以補了補 DP 的一些優化,寫篇 blog 總結一下。 1. 單調隊列/單調棧優化 1.2 演算法介紹 這應該算是最基礎的 DP 優化方法了。 顧名思義,單調隊列/單調棧優化 DP 就是保持容器內元素的單調性,以達成減少冗餘狀態的目的。 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...