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
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...