精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從源碼分析 Python 底層如何實現字典的這些特性

開發 后端
本文簡單介紹了 Python 字典的底層數據結構和實現算法,通過使用內存優化的哈希表,dict 很好地支持了快速查找和插入有序等特性。這種數據結構設計方法非常很值得我們在開發中借鑒使用。

[[389930]]

 在《RealPython 基礎教程:Python 字典用法詳解》這篇文章中,我們介紹了 dict 的特性:

  • dict 是存儲鍵值對的關聯容器
  • dict 中的 key 是唯一的
  • 可使用 dict[key] 語法來快速訪問 dict 中的元素
  • Python 3.6 之后的版本會保持元素添加到 dict 中的順序

那么,Python 底層是如何支撐這些特性的呢?其運行效率如何?

我們今天就來簡單探索一下 dict 在 Python 中的底層實現,并嘗試結合 CPython 源碼來回答上邊的問題。

【基本原理】

首先我們來思考一下如何從一批數據中快速查找一個元素。

在計算機中,對數據的訪問是基于數據的存儲方式的,不同的存儲方式訪問效率差別很大。

我們熟知的 list,底層是基于數組實現的。數組的優點在于能通過索引實現隨機訪問,非常快,時間復雜度為O(1)。但前提是,你需要知道被訪問的元素的位置。而對于 key-value 這種關聯數據,我們在應用中并不關注其存放位置。

如果單純使用數組來存放 key-value,我們需要按順序比對數組中的每個元素,找到目的 key。當數據量很大時,這種查找效率很低。

有沒有能實現高效比對的數據結構呢?有!

學過 C++ 的同學應該知道,C++ 標準庫提供了一個關聯容器:map。它可以高效地存取鍵值對,其底層是基于紅黑樹來實現的。紅黑樹是一個自平衡的二叉搜索樹,查找效率很高。

那么,Python 中的 dict 是基于紅黑樹實現的嗎?答案是否定的。

Python 為了實現更快的訪問速率,采用了另一種存儲結構:哈希表。

哈希表基于數組隨機訪問的特性,使用哈希算法來快速計算 key 的哈希值,從而定位元素在底層數組中的位置,實現元素的快速訪問。

這種結構的訪問效率和數組相同,但是存在一定的缺點:哈希算法無法保證對每個 key 求值結果的唯一性,因而不同的 key 可能會得到相同的存放位置。這就導致了沖突。

哈希表需要采取一定的策略來避免鍵沖突。當然,存在沖突的鍵的訪問效率也會有所降低。

下面我們就來看一下 CPython 是如何通過哈希表來實現 dict 的。

【字典相關數據結構】

1,字典對象 PyDictObject

  1. typedef struct { 
  2.     PyObject_HEAD 
  3.  
  4.     /*字典用元素的個數*/ 
  5.     Py_ssize_t ma_used; 
  6.  
  7.     /*全局唯一的版本號,會在 dict 被修改時發生變化*/ 
  8.     uint64_t ma_version_tag;  
  9.  
  10.     /*存放元素或元素 key,承擔哈希表的具體實現*/ 
  11.     PyDictKeysObject *ma_keys;  
  12.    
  13.     /* 
  14.     當哈希表為組合(combined)模式時,value 存儲在 ma_keys 的每個 PyDictKeyEntry 對象中,此值為 NULL。 
  15.     當哈希表為分離(splitted)模式時用于存儲元素的 value。 
  16.     */ 
  17.     PyObject **ma_values;  
  18. } PyDictObject; 

每個 dict 都是一個 PyDictObject 對象。

此結構中,最重要的是 ma_keys 這個成員變量,它是實現哈希表的關鍵所在。

2,哈希表 PyDictKeysObject

  1. struct _dictkeysobject { 
  2.     Py_ssize_t dk_refcnt; 
  3.  
  4.     /* 哈希表(dk_indices)的大小,其值為 2 的乘冪. */ 
  5.     Py_ssize_t dk_size; 
  6.  
  7.     /* 用于在哈希表(dk_indices)中執行查找的函數*/ 
  8.     dict_lookup_func dk_lookup; 
  9.  
  10.     /* dk_entries 中可用 entries 的個數 */ 
  11.     Py_ssize_t dk_usable; 
  12.  
  13.     /* dk_entries 中已用 entries 的個數 */ 
  14.     Py_ssize_t dk_nentries; 
  15.  
  16.     /* 哈希表. 可動態 resize。64位系統上其最小尺寸為8,32位系統上最小尺寸為4. */ 
  17.     char dk_indices[]; 
  18.      
  19.     /* "PyDictKeyEntry dk_entries[dk_usable];" */ 
  20. }; 
  21.  
  22. typedef struct _dictkeysobject PyDictKeysObject; 

從名稱來看,PyDictKeysObject 是用來存儲字典元素的 key 的。而實際上,在組合模式下,它存儲的是 key-value 對。那么,無論哪種模式,至少 key 是存儲在這個對象中的。

這個對象是我們研究的重點。

PyDictKeysObject 的內存布局如下所示:

我們在上邊代碼中簡單標注了 PyDictObject 各成員變量的含義。現在重點關注dk_indices。

dk_indices 是一個 char 類型的數組,從定義來看,這是一塊裸內存。它正是哈希表真正使用的存儲空間。

dk_indices 數組的前部分存放的是字典元素(鍵值對)在 dk_entries 中的索引值。我們可把這部分叫做:哈希表索引內存塊。

根據數組大小的不同,每個索引值的類型具有不同的解釋方法。

索引類型 數組大小 dk_size
int8 dk_size <= 128
int16 256   <= dk_size <= 2**15
int32 2**16 <= dk_size <= 2**31
int64 dk_size >= 2**32

由此可見,數組越大,每個值表示的索引范圍也越大。

每個索引值的取值區間為[0, dk_size*2/3],或者為:-1(內存未被使用過),-2(內存已使用過)。

dk_indices 數組的后半部分用于存儲 dict 中的元素。這段空間被解釋為:PyDictKeyEntry dk_entries[dk_usable]。我們可把這部分叫做:哈希表鍵值對內存塊。

dk_entries 中元素的個數為 dk_size 的 2/3。這個值既能有效減少 key 的沖突,也可提升內存空間的利用率。

3,字典元素

  1. typedef struct { 
  2.     Py_hash_t me_hash;  /* 對 me_key 哈希值的緩存 */ 
  3.     PyObject *me_key; 
  4.     PyObject *me_value; /* 僅當哈希表為組合模式時有意義 */ 
  5. } PyDictKeyEntry; 

哈希表為組合模式時,這里邊存放的就是我們的鍵值對。

哈希表為分離模式時,僅通過 me_key 存儲元素是 key。

【hash 表】

從上邊數據結構的定義中,我們已經知道,dict 會將鍵值對存放在一塊連續的內存空間 dk_indices 中。dk_indices 正是 dict 使用的哈希表。

那么, 如何理解 dk_indices 這個哈希表呢?

通常,哈希表有兩種實現方式:沖突鏈和開放尋址。這兩種方式對應的是兩種解決鍵沖突的方法。

沖突鏈:將哈希值相同的 key 組織為一個鏈表。

哈希表只存放指向元素鏈表的指針,哈希值相同的元素依次追加到每個鏈表的尾部。

開放尋址:從哈希表中的沖突位置查找下一個可用的位置。

元素存放在哈希表中,若發現沖突,從沖突位置(如 kv1 所在位置)開始通過某種策略查找下一個可用的位置(如 kv3)。

CPython 采用的是開放尋址方式,并且使用了一種優化的存儲結構。

dk_indices 數組的前部分用來存儲鍵值對的位置索引,后部分用來存儲鍵值對。這是一種高效緊湊的存儲結構。

我們從 dictobject.c 的 insert_dict() 函數中截取一段代碼,來驗證這個結構。

insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) 函數用于向字典 mp 中插入一個哈希值為 hash 的 key-value 鍵值對。

這個片段開頭的 if (ix == DKIX_EMPTY) 表明可以將這個鍵值對插入哈希表的一個未曾使用過的位置(稱為 slot)中。

代碼接下來檢查哈希表剩余空間是否可用,不足則 resize。

接下來調用 find_empty_slot() 獲取 slot 在哈希表索引內存塊中的位置索引 hashpos,這個函數實現了沖突算法。

通過 DK_ENTRIES 宏獲取 ma_keys 中下一塊可用的內存 ep,由于哈希表鍵值對內存塊是連續的,下一塊可用的內存可通過當前已存儲的鍵值對個數 dk_nentries 加上 dk_indices 前部分的偏移計算而來。

  1. #define DK_ENTRIES(dk) \ 
  2.     ((PyDictKeyEntry*)(&((int8_t*)((dk)->dk_indices))[DK_SIZE(dk) * DK_IXSIZE(dk)])) 

我們通過 DK_ENTRIES 的宏定義能清楚地看到它是在訪問 dk_indices 的鍵值對內存塊。

現在,我們知道了元素在哈希表索引內存塊中的位置 hashpos 和在鍵值對內存塊中的“相對位置” dk_nentries,調用 dictkeys_set_index() 即可在哈希表中設置這兩者的關系:indices[hashpos] = dk_nentries.

接下來的代碼對 ep 指向的內存數據進行了更新,并累加 dk_nentries。

大家可仔細體會一下這個過程。

這種存儲結構,也保證了使用 key 訪問元素的效率。

由 key 的哈希值能快速映射到元素在哈希表索引內存塊的位置 hashpos,再由 hashpos 中保存的鍵值對內存塊的位置偏移“索引”就可以直接訪問對應的鍵值對。

【hash 算法和沖突算法】

實現哈希表有三個重要的元素:數據結構、hash 算法和沖突算法。

我們已經了解了數據結構。那么,CPython 使用什么 hash 算法呢?

如果你沒有手動實現 __hash__ 方法,它就使用內置的 hash() 函數來計算 key 的哈希值。

CPython 采用開放尋址的方法來解決沖突。

其沖突算法如下:

首先初始化哈希表的位置索引 i,然后獲取 i 處存放的鍵值對內存塊的索引 ix。在循環中不斷更新 i 并檢測 ix 的值,直到 ix < 0,即此時哈希表索引內存塊的 i 處代表著一個從未使用的 slot。

更新 i 的算法不太容易理解,可不用深究。

【如何保持元素插入順序】

dict 一個有趣的特性就是會保持元素插入時的位置順序:

  1. >>> d={} 
  2. >>> d[3]="Three" 
  3. >>> d[1]="One" 
  4. >>> d[2]="Two" 
  5. >>> d[0]="Zero" 
  6. >>> d 
  7. {3: 'Three', 1: 'One', 2: 'Two', 0: 'Zero'
  8. >>> 
  9. >>> list(d.keys()) 
  10. [3, 1, 2, 0] 

從上邊對哈希表的分析中,我們很容易就能明白其中的原因:元素被逐個追加到鍵值對內存塊的尾部。

當我們打印 dict,或調用其 keys() 方法時,dict 直接訪問鍵值對內存塊。因而可按照元素插入時的順序將它們返回。

【resize】

既然 dict 使用了連續的內存塊來實現哈希表,那么當插入較多元素時,其內存空間有可能不足,這時就需要擴大內存。另一方面,如果之前已分配了較大內存空間,而后執行了大量刪除元素的操作,這時候也有必要減小內存,避免浪費。

  1. static int 
  2. insertion_resize(PyDictObject *mp) 
  3.     return dictresize(mp, GROWTH_RATE(mp)); 

insertion_resize() 調用 dictresize() 來調整 dict 的大小。dictresize() 的第二個參數就是調整后的大小,這里是一個宏。在 CPython 3.9.2 中,其定義為:

#define GROWTH_RATE(d) ((d)->ma_used*3)

可以看到,dict 的大小會被調整為原來已使用(包含有效鍵值對)內存的 3 倍。

這個調整幅度還是蠻大的,其好處是可以避免頻繁 resize。

【結語】

本文簡單介紹了 Python 字典的底層數據結構和實現算法,通過使用內存優化的哈希表,dict 很好地支持了快速查找和插入有序等特性。這種數據結構設計方法非常很值得我們在開發中借鑒使用。

本文轉載自微信公眾號「python學與思」,可以通過以下二維碼關注。轉載本文請聯系python學與思公眾號。

 

責任編輯:武曉燕 來源: python學與思
相關推薦

2023-08-11 08:42:49

泛型工廠繼承配置

2025-03-31 00:00:00

MCPAPI服務器通信

2021-07-20 10:26:53

源碼底層ArrayList

2021-03-16 21:45:59

Python Resize機制

2025-03-05 00:49:00

Win32源碼malloc

2019-10-16 16:33:41

Docker架構語言

2020-05-14 11:19:19

降序索引子集

2017-10-23 10:13:18

IO底層虛擬

2020-12-14 08:03:52

ArrayList面試源碼

2020-12-17 08:03:57

LinkedList面試源碼

2024-08-08 11:05:22

2023-11-24 17:58:03

Python哈希

2017-05-22 15:42:39

Python字典哈希表

2020-04-27 07:13:37

Nginx底層進程

2023-11-06 19:00:17

Python

2022-04-13 14:43:05

JVM同步鎖Monitor 監視

2017-04-05 20:00:32

ChromeObjectJS代碼

2020-08-26 14:00:37

C++string語言

2021-03-05 18:38:45

ESvue項目

2021-02-26 13:59:41

RocketMQProducer底層
點贊
收藏

51CTO技術棧公眾號

国产黄在线看| 色av性av丰满av| 超碰成人在线免费| 亚洲午夜久久久久久久久电影网 | 成人精品国产一区二区4080| 97久久精品在线| 亚洲自拍偷拍图| 精品中文视频| 欧美性猛交xxxx偷拍洗澡| 一区二区不卡在线视频 午夜欧美不卡'| 国产精品综合在线| 中国女人久久久| www日韩欧美| 亚洲欧美日本一区| 白嫩亚洲一区二区三区| 福利精品视频在线| 女同性恋一区二区| 久久经典视频| 岛国精品在线观看| 91精品国产综合久久香蕉| 国产毛片aaa| 欧美伊人影院| 中文字幕亚洲在线| 中文成人无字幕乱码精品区| 国产精品一区免费在线| 色999日韩国产欧美一区二区| 欧美xxxx吸乳| 自拍视频在线免费观看| 96av麻豆蜜桃一区二区| 亚洲自拍偷拍第一页| 一级黄色在线观看| 中文亚洲欧美| 韩国一区二区电影| 国产女人被狂躁到高潮小说| 色小子综合网| 在线看福利67194| 亚洲精品理论片| jizz国产精品| 日韩精品一区二区在线| 污污的网站免费| 精品视频在线一区二区在线| 欧美日韩在线视频首页| 成人在线播放网址| 在线播放免费av| 中文字幕综合网| 制服诱惑一区| 含羞草www国产在线视频| 中文文精品字幕一区二区| 欧美裸体网站| 欧美一区二区视频| 久久综合九色综合欧美就去吻| 福利视频久久| 噜噜噜久久,亚洲精品国产品| 国产一区二区影院| 国产在线a不卡| 国产乱叫456在线| 国产一区视频网站| 亚洲一区国产精品| www.久久伊人| 成人午夜免费电影| 精品欧美一区二区久久久伦| 天堂在线中文字幕| 久久综合九色综合97婷婷女人 | 色资源在线观看| 97超碰欧美中文字幕| 美女三级99| 可以免费看污视频的网站在线| 久久影院视频免费| 日韩.欧美.亚洲| 91最新在线| 亚洲三级小视频| 久久久99精品视频| a级片免费在线观看| 精品久久久久久中文字幕大豆网| 国产精品沙发午睡系列| 欧美极品影院| 欧美日韩高清在线播放| 天天干天天曰天天操| 懂色av一区二区| 亚洲精品在线视频| 久久久精品成人| 在线电影一区二区| 97在线免费视频| 天堂av免费在线观看| 老司机免费视频一区二区| 亚洲专区中文字幕| 亚洲av片在线观看| 国产精品美女久久久久久久久| 看全色黄大色大片| 天堂资源在线| 欧美人妇做爰xxxⅹ性高电影 | 日本韩国欧美中文字幕| 久久在线精品| 91夜夜揉人人捏人人添红杏| 特黄视频在线观看| 国产精品人人做人人爽人人添| 永久免费网站视频在线观看| 日韩伦理福利| 8x8x8国产精品| 亚洲综合自拍网| 国产精品毛片久久| 亚洲欧洲另类| 日韩精品一区二区三区视频在线观看| a级片在线观看视频| 国产日产精品_国产精品毛片| 久久天天躁日日躁| 精品成人av一区二区在线播放| 日韩精品一二三区| 成人免费看片网址| 成人在线免费公开观看视频| 一区二区三区免费| av免费网站观看| 亚洲一二av| 色婷婷综合久久久久| 国产一级淫片a| 精品一区二区精品| 美日韩精品免费| 视频在线观看入口黄最新永久免费国产| 色狠狠综合天天综合综合| 亚洲911精品成人18网站| 亚洲人成精品久久久| 色综合久久精品亚洲国产| 亚洲精品国产无码| 99这里只有久久精品视频| 国产四区在线观看| 成人a在线观看高清电影| 亚洲精品av在线| 欧美另类视频在线观看| 免费成人在线观看视频| 欧美日韩一区二区三区在线视频 | 丁香婷婷成人| 久久精品99久久久久久久久| 国产成人无码专区| 久久综合九色综合欧美亚洲| 日韩伦理在线免费观看| 精品一区二区三区免费看| 色噜噜久久综合伊人一本| 中文字幕69页| 久久蜜桃av一区二区天堂 | 国产探花在线观看| 在线播放/欧美激情| 日本性高潮视频| 久久欧美肥婆一二区| 裸模一区二区三区免费| 色戒汤唯在线观看| 日韩成人xxxx| 日韩精品在线免费视频| 99国产精品久久久久| 日韩日韩日韩日韩日韩| 国产精品男女| 91sa在线看| 欧美熟妇交换久久久久久分类| 亚洲综合久久av| 熟女人妻一区二区三区免费看| 欧美日韩精选| 国产精品久久国产精品| 爱情岛亚洲播放路线| 亚洲精品美女久久| 亚洲熟妇无码乱子av电影| 久久综合999| 九九九在线观看视频| 国产亚洲一区二区三区不卡| 国产精品福利网站| 免费av毛片在线看| 欧美一区二区视频在线观看2022| 成人免费视频网站入口::| 国产凹凸在线观看一区二区| 久久久久免费看黄a片app| 欧美男男freegayvideosroom| 2019亚洲日韩新视频| 国产一级免费在线观看| 欧美日韩免费观看一区二区三区| 国产精品精品软件男同| 国产不卡视频一区| 久久无码高潮喷水| 日韩精品影视| 成人av男人的天堂| 久久青青视频| 久久成人亚洲精品| 日韩中文字幕综合| 在线观看日产精品| 色欲一区二区三区精品a片| 粉嫩绯色av一区二区在线观看| 一区二区传媒有限公司| 欧美日韩有码| 国产高清自拍一区| 电影一区二区三| 久久精品国产亚洲一区二区| 亚洲免费成人在线| 欧美性感一区二区三区| 欧美毛片在线观看| 国产女人18水真多18精品一级做| 佐山爱在线视频| 丝袜亚洲另类丝袜在线| 日日噜噜夜夜狠狠久久丁香五月| 美女视频亚洲色图| 成人黄色av免费在线观看| 精品丝袜在线| 久久久久999| 你懂的免费在线观看| 欧美一区二区免费观在线| wwwwww国产| 亚洲激情男女视频| 日本理论中文字幕| av不卡一区二区三区| 亚洲精品第三页| 天堂久久久久va久久久久| 精品少妇人欧美激情在线观看| 欧美精品一区二区久久| 国产区一区二区三区| 成人国产精品一区二区网站| 日韩女在线观看| 91超碰在线| 欧美大学生性色视频| 97电影在线看视频| 亚洲人成电影在线观看天堂色| 精品人妻一区二区三区蜜桃| 欧美三级欧美一级| 看片网址国产福利av中文字幕| 亚洲免费观看在线观看| 99精品欧美一区二区| 91麻豆精品视频| 日韩精品视频一区二区| 国产福利电影一区二区三区| 色片在线免费观看| 视频一区欧美日韩| 欧美牲交a欧美牲交| 欧美色一级片| 久久国产精品免费观看| 日韩一区二区在线免费| 奇米888一区二区三区| 人妖一区二区三区| 国产精品夜夜夜一区二区三区尤| 国产不卡精品在线| 国产日韩精品在线播放| 51一区二区三区| 国产精品久久激情| 欧洲精品一区二区三区| 日本在线精品视频| 成人短视频app| 日韩美女在线观看| 成人免费看黄| 欧洲成人在线观看| 性欧美18xxxhd| 国产69久久精品成人看| 国产精品迅雷| 日本亚洲欧洲色α| 欧美电影免费观看高清完整| 国产va免费精品高清在线观看| 自拍偷拍欧美视频| 欧洲成人免费视频| 欧美精品总汇| 国产精品入口免费视| 粉嫩91精品久久久久久久99蜜桃| 国产精品 欧美在线| yw.尤物在线精品视频| 国产精品女人网站| japansex久久高清精品| 亚洲999一在线观看www| 视频成人永久免费视频| 国产成人精品日本亚洲11| 国产精伦一区二区三区| 麻豆av一区二区三区| 国产伦精品一区二区三区千人斩 | 国产视频网站在线| 在线一区二区日韩| 久cao在线| 久久久久女教师免费一区| a'aaa级片在线观看| 欧美一级大片在线免费观看| 色香欲www7777综合网| 成人做爽爽免费视频| 伊人久久大香线蕉av超碰| 国产视频精品网| 成人高清av| 国产精品一二三在线观看| 最新成人av网站| 国产九九在线视频| 国产乱人伦精品一区二区在线观看| 成人啪啪18免费游戏链接| 久久看人人爽人人| 中文字幕美女视频| 亚洲国产日韩a在线播放| 男人日女人网站| 777奇米成人网| 天堂在线资源库| 搡老女人一区二区三区视频tv| 手机在线免费观看av| 日韩免费观看视频| 国产精品国产三级在线观看| 精品日本一区二区| 成人av动漫在线观看| 国产一区二区三区乱码| 男人的天堂久久精品| 美女网站视频在线观看| 国产日韩欧美一区二区三区乱码 | 中文字幕一区二区人妻电影丶| 国产亚洲成年网址在线观看| 男人的天堂久久久| 日韩欧美aⅴ综合网站发布| 97caocao| 亚洲精品国产suv| 成人免费高清在线播放| 久久免费视频网站| 日韩成人在线电影| 精品一区二区视频| 一二三区不卡| 超碰在线公开97| 久久久久久黄色| 国产在线欧美在线| 欧美日本一道本在线视频| 性插视频在线观看| 九九热精品视频| 欧美三级电影网址| 欧美日韩一区二区三| 亚洲成人原创| 午夜影院免费版| 国产精品嫩草99a| 探花视频在线观看| 精品av久久707| 99在线播放| 91精品国产综合久久香蕉922| 国产一区二区三区天码| 美女日批免费视频| 国产丶欧美丶日本不卡视频| 国产精品久久久久久成人| 91福利资源站| 你懂的在线播放| 欧美一级高清免费播放| 精品资源在线| 我的公把我弄高潮了视频| 国产成人精品影院| 波多野结衣爱爱视频| 欧美精品九九99久久| 幼a在线观看| 国产精品永久免费在线| 日本精品黄色| 国产精品视频分类| 欧美激情一区二区三区| 亚洲综合成人av| 国产一区av在线| 欧美日韩尤物久久| 亚洲美女搞黄| 久久黄色级2电影| 国产中文字幕久久| 91精品一区二区三区久久久久久| 日本中文字幕电影在线免费观看| 国产精品入口免费视| 天天操综合网| 国产精品中文久久久久久| 一区二区三区欧美久久| 亚洲国产精品一| 午夜精品久久久99热福利| 久久久久观看| 成人久久久久久久久| 国产拍欧美日韩视频二区| 中文字幕乱码无码人妻系列蜜桃| 一区二区中文字幕| 看片一区二区| 五月天激情图片| 99视频热这里只有精品免费| 亚洲高清毛片一区二区| 在线看欧美日韩| 不卡一区视频| 美女扒开大腿让男人桶| 91丨九色porny丨蝌蚪| 国产精品乱码一区二区视频| 色悠悠久久久久| 日韩激情欧美| 欧美老熟妇喷水| 中文字幕高清一区| av男人天堂网| 91精品国产91久久久久久| 深爱激情综合| 在线播放黄色av| 亚洲成人777| 福利在线午夜| 91社区国产高清| 亚洲高清在线| ass极品国模人体欣赏| 日韩视频免费直播| 日本在线啊啊| 一区二区三区四区不卡| 处破女av一区二区| 五月天婷婷导航| 欧美麻豆久久久久久中文| 欧美电影在线观看完整版| 国产又黄又猛又粗又爽的视频| 亚洲男人电影天堂| 亚洲av成人精品一区二区三区在线播放| 国产精品美女网站| 国产精品分类| 日韩毛片无码永久免费看| 日韩欧美www| av激情成人网| 免费视频爱爱太爽了| 久久九九影视网| 亚洲黄色片视频| 国产精品美女免费看| 在线欧美一区|