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
  • 經常看到有群友調侃“為什麼搞Java的總在學習JVM調優?那是因為Java爛!我們.NET就不需要搞這些!”真的是這樣嗎?今天我就用一個案例來分析一下。 昨天,一位學生問了我一個問題:他建了一個預設的ASP.NET Core Web API的項目,也就是那個WeatherForecast的預設項目模 ...
  • 很多軟體工程師都認為MD5是一種加密演算法,然而這種觀點是不對的。作為一個 1992 年第一次被公開的演算法,到今天為止已經被髮現了一些致命的漏洞。本文討論MD5在密碼保存方面的一些問題。 ...
  • Maven可以使我們在構建項目時需要用到很多第三方類jar包,如下一些常用jar包 而maven的出現可以讓我們避免手動導入jar包出現的某些問題,它可以自動下載那須所需要的jar包 我們只需要在創建的maven項目自動生成的pom.xml中輸入如下代碼 <dependencies> <!--ser ...
  • 來源:https://developer.aliyun.com/article/694020 非同步調用幾乎是處理高併發Web應用性能問題的萬金油,那麼什麼是“非同步調用”? “非同步調用”對應的是“同步調用”,同步調用指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步調 ...
  • 1.面向對象 面向對象編程是在面向過程編程的基礎上發展來的,它比面向過程編程具有更強的靈活性和擴展性,所以可以先瞭解下什麼是面向過程編程: 面向過程編程的核心是過程,就是分析出實現需求所需要的步驟,通過函數一步一步實現這些步驟,接著依次調用即可,再簡單理解就是程式 從上到下一步步執行,從頭到尾的解決 ...
  • 10瓶毒藥其中只有一瓶有毒至少需要幾隻老鼠可以找到有毒的那瓶 身似浮雲,心如飛絮,氣若游絲。 用二分查找和二進位位運算的思想都可以把死亡的老鼠降到最低。 其中,二進位位運算就是每一隻老鼠代表一個二進位0或1,0就代表老鼠存活,1代表老鼠死亡;根據數學運算 23 = 8、24 = 16,那麼至少需要四 ...
  • 一、Kafka存在哪些方面的優勢 1. 多生產者 可以無縫地支持多個生產者,不管客戶端在使用單個主題還是多個主題。 2. 多消費者 支持多個消費者從一個單獨的消息流上讀取數據,而且消費者之間互不影響。 3. 基於磁碟的數據存儲 支持消費者非實時地讀取消息,由於消息被提交到磁碟,根據設置的規則進行保存 ...
  • 大家好,我是陶朱公Boy。 前言 上一篇文章《關於狀態機的技術選型,最後一個真心好》我跟大家聊了一下關於”狀態機“的話題。從眾多技術選型中我也推薦了一款阿裡開源的狀態機—“cola-statemachine”。 於是就有小伙伴私信我,自己項目也考慮引入這款狀態機,但網上資料實在太少,能不能系統的介紹 ...
  • 使用腳本自動跑實驗(Ubuntu),將實驗結果記錄在文件中,併在實驗結束之後將結果通過郵件發送到郵箱,最後在windows端自動解析成excel表格。 ...
  • 話說在前面,我不是小黑子~ 我是超級大黑子😏 表弟大周末的跑來我家,沒事幹天天騷擾我,搞得我都不能跟小姐姐好好聊天了,於是為了打發表弟,我決定用Python做一個小游戲來消耗一下他的精力,我思來想去,決定把他變成小黑子,於是做了一個坤坤打籃球的游戲,沒想到他還挺愛玩的~ 終於解放了,於是我把游戲寫 ...