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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...