Python中Dict的查找

Dict的類型的查找使用的是lookdict函數

static PyDictKeyEntry *
lookdict(PyDictObject *mp, PyObject *key,Py_hash_t hash, PyObject ***value_addr)

函數的參數中,*value_addr是指向匹配slot中值的指針。 這個函數在正確的情況下一定會返回一個指向slot的指針,出錯則會返回NULL。 如果成功找到了匹配的slot,則返回對應的slot; 如果沒有匹配的slot,則返回查找鏈上第一個未被使用的slot。 該slot可以是unused狀態,也可以是dummy狀態。

    mask = DK_MASK(mp->ma_keys);ep0 = &mp->ma_keys->dk_entries[0];i = (size_t)hash & mask;

計算了slot的初始位置,把hash值映射到slot table的下標范圍內。 初始位置=hash&mask,mask=dk_size-1

    if (ep->me_key == NULL || ep->me_key == key) {*value_addr = &ep->me_value;return ep;}

如果找到了匹配的key或unused slot,返回該結果即可。

    if (ep->me_key == dummy)freeslot = ep;else {if (ep->me_hash == hash) {startkey = ep->me_key;Py_INCREF(startkey);cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);Py_DECREF(startkey);if (cmp < 0)return NULL;if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {if (cmp > 0) {*value_addr = &ep->me_value;return ep;}}else {/* The dict was mutated, restart */goto top;}}freeslot = NULL;}

進一步的比較。 若該slot狀態為dummy,則用freeslot記錄該slot并繼續搜索; 如果該slot的hash值與待搜索key的hash相同,那么對兩個key進行比較。 這里的PyObject_RichCompareBool是一個比較函數,其第三個參數為比較的操作。 如果操作結果為true,返回1;為false,返回0;比較出錯,返回-1。 比較出錯的情況下會返回NULL,比較成功(在這里為相等)返回該slot,比較不成功則繼續進行搜索。 這一部分進行了第一次的搜索;在dict容量不太滿時,一般在這里就可以找到合適的結果。

        i = (i << 2) + i + perturb + 1;ep = &ep0[i & mask];if (ep->me_key == NULL) {if (freeslot == NULL) {*value_addr = &ep->me_value;return ep;} else {*value_addr = &freeslot->me_value;return freeslot;}}

找到了unused slot的情況。 如果freeslot是NULL,那么返回該slot即可;若freeslot不是NULL,那么返回freeslot。

        if (ep->me_key == key) {*value_addr = &ep->me_value;return ep;}

找到了匹配的key。此情況返回對應slot即可。

        if (ep->me_hash == hash && ep->me_key != dummy) {startkey = ep->me_key;Py_INCREF(startkey);cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);Py_DECREF(startkey);if (cmp < 0) {*value_addr = NULL;return NULL;}if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {if (cmp > 0) {*value_addr = &ep->me_value;return ep;}}else {/* The dict was mutated, restart */goto top;}}

該slot hash值與給定hash值相同時進一步比較的情況。

        else if (ep->me_key == dummy && freeslot == NULL)freeslot = ep;

在dummy情況下設置freeslot。

?

在搜索過程中,原則是找到和key相等的對象即可。 那么什么是和key相等呢? 一種情況是它們的引用相等,自然的值也相等。 這類比較只需要直接比較對應指針是否相等呢該即可。 而另一種情況是引用不相等,但值還相等。 如果沒有對這種情況的處理,那么對于非共享的對象來說搜索幾乎不會得到正確的結果。 搜索中的進一步比較就是對這種情況的處理。 進一步比較發生的前提是hash值相等,因為值相等必然有hash相等, 但hash相等值卻可能不等,因此不能直接比較hash值,還需要更進一步的比較值才可以。

轉載于:https://www.cnblogs.com/ruizhang3/p/6888006.html

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

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

相關文章

文字特效代碼大全

代碼收集來源于網絡博友,感謝博友提供,本人只收集,整理,說明. 1.刪除線:<FONT style"TEXT-DECORATION: line-through">寫上你想寫的字</FONT> 效果如下 寫上你想寫的字 2.文字頂部加橫線:<font style"text-decoration:overline">寫上你想…

oracle 會話實例,返璞歸真:Oracle實例級別和會話級別的參數設置辨析

楊廷琨(yangtingkun)云和恩墨 CTO高級咨詢顧問&#xff0c;Oracle ACE 總監&#xff0c;ITPUB Oracle 數據庫管理版版主參數文件是Oracle數據庫文件中級別最低&#xff0c;也是最基本的文件&#xff0c;但是也是數據庫實例啟動第一個涉及的文件。如果參數文件缺失或者某些參數設…

ExtJs CheckboxSelectionModel 全選操作后 清空表格頭的checkBox

關鍵代碼&#xff1a; var hd Ext.getCmp("interviewSubscriptionGrid").getEl().select(div.x-grid3-hd-checker).first(); if (hd.hasClass(x-grid3-hd-checker-on)) { hd.removeClass(x-grid3-hd-checker-on); } 轉自&#xff1a;ExtJs Checkbox…

在多節點集群中運行Cassandra

這篇文章收集了我在多節點中設置Apache Cassandra集群的步驟。 在設置集群時&#xff0c;我已經參考了Cassandra Wiki和Datastax文檔。 詳細介紹了以下過程&#xff0c;分享了我建立群集的經驗。 設置第一個節點 添加其他節點 監視集群– nodetool &#xff0c; jConsole &am…

Oracle 添加 scott 示例用戶

學習SQL有一段時間了&#xff0c;但是也忘記的差不多了&#xff0c;今天有趕緊復習復習&#xff0c;然后發現一個問題&#xff0c;為啥之前看的視頻教程&#xff0c;馬士兵用的Oracle有scott用戶和那些表格&#xff0c;而我的沒有&#xff1f;難道是Oracle取消了&#xff1f;然…

win8oracle10g安裝報錯,Win8電腦安裝Oracle 10g提示程序異常終止的解決方法

有win8系統用戶反映說在安裝Oracle 10g的時候&#xff0c;選擇高級安裝之后&#xff0c;就彈出一個窗口&#xff0c;提示程序異常終止&#xff0c;發生內部錯誤&#xff0c;導致Oracle 10g安裝失敗&#xff0c;該怎么解決這樣的問題呢&#xff1f;下面隨小編一起來看看Win8電腦…

MFC的消息循環

MFC的消息循環 消息分為隊列消息(進入線程的消息隊列)和非隊列消息(不進入線程的消息隊列)。對于隊列消息&#xff0c;最常見的是鼠標和鍵盤觸發的消息&#xff0c;例如WM_MOUSERMOVE,WM_CHAR等消息&#xff1b;還有例如&#xff1a;WM_PAINT、WM_TIMER和WM_QUIT。當鼠標、鍵…

<avatar: frontiers of pandora>技術overview

https://www.eurogamer.net/digitalfoundry-2023-avatar-frontiers-of-pandora-and-snowdrop-the-big-developer-tech-interview https://www.youtube.com/watch?vLRI_qgVSwMY&t394s 主要來自euro gamer上digital foundry對于avatar的開發團隊Massive工作室的采訪&#xf…

使用Hibernate 4,JPA和Maven的架構創建腳本

這種情況很簡單–您想要在構建應用程序時生成數據庫模式創建腳本&#xff08;然后在目標數據庫上執行腳本&#xff09;&#xff0c;這對于Hibernate 3來說相對容易&#xff0c;因為有 hibernate3-maven-plugin &#xff0c;但是與Hibernate 4不兼容。當然&#xff0c;對于每個新…

iOS 啟動連續閃退保護方案

版權聲明&#xff1a;本文由劉笑江原創文章&#xff0c;轉載請注明出處: 文章原文鏈接&#xff1a;https://www.qcloud.com/community/article/79 來源&#xff1a;騰云閣 https://www.qcloud.com/community 一.引言 “如果某個實體表現出以下任何一種特性&#xff0c;它就具備…

實戰Java內存泄漏問題分析 -- hazelcast2.0.3使用時內存泄漏 -- 2

hazelcast 提供了3中方法調用startCleanup:第一種是在ConcuurentMapManager的構造函數中&#xff0c;通過調用node的executorManager中的ScheduledExecutorService來創建每秒運行一次cleanup操作的線程&#xff08;代碼例如以下&#xff09;。因為這是ConcuurentMapManager構造…

oracle 11203 ora32701,11G RAC ORA-32701 參考學習

節點1&#xff1a;Wed Feb 13 16:08:06 2019Errors in file /u01/app/oracle/diag/rdbms/testdb/testdb1/trace/testdb1_dia0_9267.trc (incident1248083):ORA-32701: Possible hangs up to hang ID4 detectedIncident details in: /u01/app/oracle/diag/rdbms/testdb/testdb1/…

使用@OrderBy對Spring Data MongoDB集合進行排序

這是關于調整和增強Spring Data MongoDB功能的第三篇文章。 這次&#xff0c;我發現我錯過了一個JPA功能– OrderBy批注。 OrderBy指定在檢索關聯值時集合值關聯的元素的順序。 在本文中&#xff0c;我將展示如何使用Spring Data MongoDB使用OrderBy批注實現排序 。 用例 對…

@SuppressLint(NewApi)和@TargetApi()的區別

轉自&#xff1a;http://blog.csdn.NET/wbshuang09/article/details/44920549在Android代碼中&#xff0c;我們有時會使用比我們在AndroidManifest中設置的android:minSdkVersion版本更高的方法&#xff0c;此時編譯器會提示警告&#xff0c;解決方法是在方法上加上SuppressLin…

零基礎自學編程前需要知道的知識

你是否適合編程?學習編程后能做什么?如何選擇編程語言?有哪些免費的線上學習網站推薦?今天這篇好文將那些自學編程前需要了解和思考的問題都記錄下來&#xff0c;希望能給那些剛剛開始或正準備自學編程的朋友們帶去一些啟發。 你是否適合自學編程 自學編程會是一個漫長而艱…

oracle系統庫名,Oracle?札記之?一:數據庫名,數據庫實例名,數據庫域名,操作系統環境變量...

數據庫名是用于區分數據庫的一個內部標識&#xff0c;是以二進制方式存儲在數據庫控制文件中的參數。數據庫創建之后不能再修改這個參數。數據庫創建后&#xff0c;它被寫入數據庫參數文件pfile或Spfile中。格式如下&#xff1a;...db_name"orcl"db_domaindbcenter.t…

用于基于SWT的應用程序的RichText編輯器組件

本文將完成使用SWT實現我們自己的RichText編輯器組件的任務。 在為我的一位客戶開發基于桌面的應用程序時&#xff0c;我遇到了這樣一個可視化組件的需求&#xff0c;并希望添加一項功能&#xff0c;以允許用戶使用粗體&#xff0c;斜體&#xff0c;刪除線等功能來寫富文本注釋…

Eclipse設置黑色主題

1點擊help--->install new software 2輸入 http://eclipse-color-theme.github.com/update 3下載安裝eclipse color theme插件如下圖 4完成后點擊windows--->preferences------>Appearance下多了一個Color Theme 5,點擊選擇喜歡的主題即可&#xff0c;也可以自己下載主…

wcf rest系列文章

http://www.cnblogs.com/artech/archive/2012/02/15/wcf-rest.html 需要注意的是&#xff0c;發布的服務&#xff0c;可以在web behavior中指定顯示help頁面。 http://localhost/ApplicationName/ServiceName.svc/help 需要注意的是&#xff0c;訪問.svc的頁面一定不要多加/;否…

登錄:應用程序錯誤通知

幾個月前&#xff0c;當我進行大型應用程序重構時&#xff0c;發現用于記錄日志的基于log4j的代碼確實令人討厭&#xff0c;重復了數百次&#xff1a; if (LOG.isDebugEnabled()) {LOG.debug("Logging some stuff " stuff); }我想擺脫isXXXEnabled&#xff0c;這就…