[cpyhon源代碼]dict對象原理學習

Cpython 2.7 分支中,dict 對象的源代碼?lookdict 搜索算法

?

 1 static PyDictEntry *
 2 lookdict(PyDictObject *mp, PyObject *key, register long hash)
 3 {
 4     register size_t i;
 5     register size_t perturb;
 6     register PyDictEntry *freeslot;
 7     register size_t mask = (size_t)mp->ma_mask;
 8     PyDictEntry *ep0 = mp->ma_table;
 9     register PyDictEntry *ep;
10     register int cmp;
11     PyObject *startkey;
12 
13     i = (size_t)hash & mask;
14     ep = &ep0[i];
15     if (ep->me_key == NULL || ep->me_key == key) //【1】
16         return ep;
17 
18     if (ep->me_key == dummy)
19         freeslot = ep;
20     else {
21 //進到這里說明 ep->me-key !=NULL && ep->me_key!=key && ep->me_key==Active
22         if (ep->me_hash == hash) {
23             startkey = ep->me_key;
24             Py_INCREF(startkey);
25             cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); //[2]這里為啥要再比較一次?
26             Py_DECREF(startkey);
27             if (cmp < 0)
28                 return NULL;
29             if (ep0 == mp->ma_table && ep->me_key == startkey) {//[3]這里明顯是相等的,為啥要再判斷一次?
30                 if (cmp > 0)
31                     return ep;
32             }
33             else {
34                 /* The compare did major nasty stuff to the
35                  * dict:  start over.
36                  * XXX A clever adversary could prevent this
37                  * XXX from terminating.
38                  */
39                 return lookdict(mp, key, hash);
40             }
41         }
42         freeslot = NULL;
43     }

?

  

兩個問題無法理解:

  1.1?dict 對象搜索算法中,進入【2】處已經說明了?ep->me_key!=key 這個條件成立,但是 【2】那里為啥要再次比較一次?me_key 和 key 呢?

百思不得其解!!!

? ? ? 原因: 【1】處為兩個指針做 == 比較,說明指針的內容相同,即指向的是同一對象

? ? ? ? ? ? ? ? ? 進入到流程【2】則說明兩個對象指向不同的內存,但是在滿足兩個條件后也認為他們“相等”,從而返回對應的項目,條件如下:

? ? ? ? ? ? ? ? ? 一是 兩個對象哈希值相等

? ? ? ? ? ? ? ? ? 二是 兩個對象的值相等(比較算法由對象提供,通常是 __eq__方法)

? ? ?舉例:dict[10000]=10,此時需要搜索 d[10000]對象的 entry 對象,搜索時 指向 10000 的Pyobject* 明顯和之前 存入 dict[10000] 值時對應的

? ? ? ? ? ? ? ?Pyobject 指針不一致,此時 p(p->int(10000) me_key) != q(q->int(10000) key),因此不會進入流程 【1】

? ? ? ? ? ? ? ?但是 p,q同時滿足規定的兩個條件,即hash值和 ob_val 都一致,因此返回 p 處的 (key,value)entry

? ?

? ? ?1.2 [3]處 判斷的條件明顯是成立的(參見藍色高亮部分),不理解為啥要重復判斷一次,暫時想不通~

? ? ?

轉載于:https://www.cnblogs.com/muyiblog/p/9387747.html

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

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

相關文章

熊貓數據集_熊貓邁向數據科學的第一步

熊貓數據集I started learning Data Science like everyone else by creating my first model using some machine learning technique. My first line of code was :通過使用某種機器學習技術創建我的第一個模型&#xff0c;我開始像其他所有人一樣學習數據科學。 我的第一行代…

SQLServer鎖的機制

SQLServer鎖的機制&#xff1a;共享鎖(S)排它鎖(X)更新鎖(U)意向共享 (IS)意向排它 (IX) 意向排它共享 (SIX)架構修改(Sch-M) 架構穩定性(Sch-S)大容量更新&#xff08;BU&#xff09;轉載于:https://www.cnblogs.com/yldIndex/p/8603902.html

你是否具有價值

一個有價值的人往往受歡迎的程度才會高。白天上午花了兩個多小時的時間幫前同事遠程解決了服務器部署時由于防火墻機制問題引起的系統功能失敗的問題。解決完這個問題之后&#xff0c;同事的心情很愉悅&#xff0c;其實我自己的心情也很愉悅&#xff0c;看來人都有幫助別人和被…

為什么選擇做班級管理系統_為什么即使在平衡的班級下準確性也很麻煩

為什么選擇做班級管理系統Accuracy is a go-to metric because it’s highly interpretable and low-cost to evaluate. For this reason, accuracy — perhaps the most simple of machine learning metrics — is (rightfully) commonplace. However, it’s also true that m…

使用Chrome開發者工具調試Android端內網頁(微信,QQ,UC,App內嵌頁等)

使用Chrome開發者工具調試Android端內網頁(微信&#xff0c;QQ&#xff0c;UC&#xff0c;App內嵌頁等) 傳送門轉載于:https://www.cnblogs.com/momozjm/p/9389912.html

517. 超級洗衣機

517. 超級洗衣機 假設有 n 臺超級洗衣機放在同一排上。開始的時候&#xff0c;每臺洗衣機內可能有一定量的衣服&#xff0c;也可能是空的。 在每一步操作中&#xff0c;你可以選擇任意 m (1 < m < n) 臺洗衣機&#xff0c;與此同時將每臺洗衣機的一件衣服送到相鄰的一臺…

netflix的準實驗面臨的主要挑戰

重點 (Top highlight)Kamer Toker-Yildiz, Colin McFarland, Julia GlickKAMER Toker-耶爾德茲 &#xff0c; 科林麥克法蘭 &#xff0c; Julia格里克 At Netflix, when we can’t run A/B experiments we run quasi experiments! We run quasi experiments with various obje…

網站漏洞檢測針對區塊鏈網站安全分析

2019獨角獸企業重金招聘Python工程師標準>>> 目前移動互聯網中&#xff0c;區塊鏈的網站越來越多&#xff0c;在區塊鏈安全上&#xff0c;很多都存在著網站漏洞&#xff0c;區塊鏈的充值&#xff0c;會員賬號的存儲性XSS竊取漏洞&#xff0c;賬號安全&#xff0c;等…

223. 矩形面積

223. 矩形面積 給你 二維 平面上兩個 由直線構成的 矩形&#xff0c;請你計算并返回兩個矩形覆蓋的總面積。 每個矩形由其 左下 頂點和 右上 頂點坐標表示&#xff1a; 第一個矩形由其左下頂點 (ax1, ay1) 和右上頂點 (ax2, ay2) 定義。 第二個矩形由其左下頂點 (bx1, by1) …

微觀計量經濟學_微觀經濟學與數據科學

微觀計量經濟學什么是經濟學和微觀經濟學&#xff1f; (What are Economics and Microeconomics?) Economics is a social science concerned with the production, distribution, and consumption of goods and services. It studies how individuals, businesses, governmen…

NPM 重新回爐

官方教程傳送門( 英文 ) 本文主要是官方文章的精煉,適合想了解一些常用操作的同學們 NPM 是 基于node的一個包管理工具 , 安裝node環境時會自帶安裝NPM. NPM版本管理 查看現有版本 npm -v 安裝最新的穩定版本 npm install npmlatest -g 安裝最新的測試版本 npm install npmn…

1436. 旅行終點站

1436. 旅行終點站 給你一份旅游線路圖&#xff0c;該線路圖中的旅行線路用數組 paths 表示&#xff0c;其中 paths[i] [cityAi, cityBi] 表示該線路將會從 cityAi 直接前往 cityBi 。請你找出這次旅行的終點站&#xff0c;即沒有任何可以通往其他城市的線路的城市。 題目數據…

如何使用fio模擬線上環境

線上表現 這里我想通過fio來模擬線上的IO場景&#xff0c;那么如何模擬呢&#xff1f; 首先使用iostat看線上某個盤的 使用情況&#xff0c;這里我們需要關注的是 avgrq-sz, avgrq-qz. #iostat -dx 1 1000 /dev/sdk Device: rrqm/s wrqm/s r/s w/s rkB/s …

熊貓數據集_熊貓邁向數據科學的第二部分

熊貓數據集If you haven’t read the first article then it is advised that you go through that before continuing with this article. You can find that article here. So far we have learned how to access data in different ways. Now we will learn how to analyze …

Python基礎綜合練習

Pycharm開發環境設置與熟悉。 練習基本輸入輸出&#xff1a; print(你好,{}..format(name)) print(sys.argv) 庫的使用方法&#xff1a; import ... from ... import ... 條件語句&#xff1a; if (abs(pos()))<1: break 循環語句&#xff1a; for i in range(5): while Tru…

POJ 3608 旋轉卡殼

思路&#xff1a; 旋轉卡殼應用 注意點&邊 邊&邊 點&點 三種情況 //By SiriusRen #include <cmath> #include <cstdio> #include <algorithm> using namespace std; const double eps1e-5; const int N10050; typedef double db; int n,m; str…

405. 數字轉換為十六進制數

405. 數字轉換為十六進制數 給定一個整數&#xff0c;編寫一個算法將這個數轉換為十六進制數。對于負整數&#xff0c;我們通常使用 補碼運算 方法。 注意: 十六進制中所有字母(a-f)都必須是小寫。 十六進制字符串中不能包含多余的前導零。如果要轉化的數為0&#xff0c;那么…

為什么我要重新開始數據科學

I’m feeling stuck.我感覺卡住了。 In my current work and in the content I create (videos and blog posts), I feel like I’ve begun to stall out. Most of the consumers of my content are at the start of their data science journey. The longer I’m in the fiel…

藍牙協議 HFP,HSP,A2DP,A2DP_CT,A2DP_TG,AVRCP,OPP,PBAP,SPP,FTP,TP,DTMF,DUN,SDP

簡介&#xff1a; HSP&#xff08;手機規格&#xff09;– 提供手機&#xff08;移動電話&#xff09;與耳機之間通信所需的基本功能。 HFP&#xff08;免提規格&#xff09;– 在 HSP 的基礎上增加了某些擴展功能&#xff0c;原來只用于從固定車載免提裝置來控制移動電話。 A2…

482. 密鑰格式化

482. 密鑰格式化 有一個密鑰字符串 S &#xff0c;只包含字母&#xff0c;數字以及 ‘-’&#xff08;破折號&#xff09;。其中&#xff0c; N 個 ‘-’ 將字符串分成了 N1 組。 給你一個數字 K&#xff0c;請你重新格式化字符串&#xff0c;使每個分組恰好包含 K 個字符。特…