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

Python 標準庫中非常有用的裝飾器

開發 后端
PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields root = [] # root of the circular doubly linked list root[:] = [root, root, None, None] # initialize by pointing to self

[[432227]]

眾所周知,Python 語言靈活、簡潔,對程序員友好,但在性能上有點不太令人滿意,這一點通過一個遞歸的求斐波那契額函數就可以說明:

  1. def fib(n): 
  2.     if n <= 1: 
  3.         return n 
  4.     return fib(n - 1) + fib(n - 2) 

在我的 MBP 上計算 fib(40) 花費了 33 秒:

  1. import time 
  2.  
  3. def main(): 
  4.     start = time.time() 
  5.     result = fib(40) 
  6.     end = time.time() 
  7.     cost = end - start 
  8.     print(f"{result = } {cost = :.4f}"
  9.  
  10. if __name__ == '__main__'
  11.     main() 

但是,假如使用標準庫中的這個裝飾器,那結果完全不一樣

  1. from functools import lru_cache 
  2.  
  3. @lru_cache 
  4. def fib(n): 
  5.     if n <= 1: 
  6.         return n 
  7.     return fib(n - 1) + fib(n - 2) 

這次的結果是 0 秒,你沒看錯,我保留了 4 位小數,后面的忽略了。

提升了多少倍?我已經計算不出來了。

為什么 lru_cache 裝飾器這么牛逼,它到底做了什么事情?今天就來聊一聊這個最有用的裝飾器。

如果看過計算機操作系統的話,你對 LRU 一定不會陌生,這就是著名的最近最久未使用緩存淘汰算法。

而 lru_cache 就是這個算法的具體實現。(這個算法可是面試經常考的哦,有的面試官要求現場手寫代碼)

現在,我們來看一個 lru_cache 的源代碼,其中的英文注釋,我已經為你翻譯為中文:

  1. def lru_cache(maxsize=128, typed=False): 
  2.     """LRU 緩存裝飾器 
  3.  
  4.     如果 *maxsize* 是 None, 將不會淘汰緩存,緩存大小也不做限制 
  5.  
  6.     如果 *typed* 是 True, 不同類型的參數將獨立做緩存,比如 f(3.0) and f(3) 將認為是不同的函數調用而緩存在兩個緩存節點上。 
  7.  
  8.     函數的參數必須可以被 hash 
  9.  
  10.     查看緩存信息使用的是命名元組 (hits, misses, maxsize, currsize) 
  11.     查看緩存信息:user_func.cache_info().  清理緩存信息:user_func.cache_clear(). 
  12.  
  13.     LRU 算法:  http://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU) 
  14.  
  15.     ""
  16.  
  17.     # lru_cache 的內部實現是線程安全的 
  18.  
  19.     if isinstance(maxsize, int): 
  20.         # 負數轉換為 0  
  21.         if maxsize < 0: 
  22.             maxsize = 0 
  23.     elif callable(maxsize) and isinstance(typed, bool): 
  24.         #如果被裝飾的函數(user_function)直接通過 maxsize 參數傳入  
  25.         user_function, maxsize = maxsize, 128 
  26.         wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) 
  27.         return update_wrapper(wrapper, user_function) 
  28.     elif maxsize is not None: 
  29.         raise TypeError( 
  30.             'Expected first argument to be an integer, a callable, or None'
  31.  
  32.     def decorating_function(user_function): 
  33.         wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) 
  34.         return update_wrapper(wrapper, user_function) 
  35.  
  36.     return decorating_function 

這里面有兩個參數,一個是 maxsize,表示緩存的大小,當傳入負數時,自動設置為 0,如果不傳入 maxsize,或者設置為 None,表示緩存沒有大小限制,此時沒有緩存淘汰。還有一個是 type,當 type 傳入 True 時,不同的參數類型會當作不同的 key 存到緩存當中。

接下來,lru_cache 的核心在這個函數上 _lru_cache_wrapper,建議有感情的閱讀、背誦并默寫。我們來看下它的源代碼

  1. def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo): 
  2.     # 所有 lru cache 實例共享的常量: 
  3.     sentinel = object()          # 用來表示緩存未命中的唯一對象 
  4.     make_key = _make_key         # build a key from the function arguments 
  5.     PREV, NEXTKEY, RESULT = 0, 1, 2, 3   # names for the link fields 
  6.  
  7.     cache = {} 
  8.     hits = misses = 0 
  9.     full = False 
  10.     cache_get = cache.get    # 綁定函數來獲取緩存中 key 的值 
  11.     cache_len = cache.__len__  # 綁定函數獲取緩存大小 
  12.     lock = RLock()           # 因為鏈表上的更新是線程不安全的 
  13.     root = []                # 循環雙向鏈表的根節點 
  14.     root[:] = [root, root, None, None]     # 初始化根節點的前后指針都指向它自己 
  15.  
  16.     if maxsize == 0: 
  17.  
  18.         def wrapper(*args, **kwds): 
  19.             # 沒有緩存,僅更新統計信息 
  20.             nonlocal misses 
  21.             misses += 1 
  22.             result = user_function(*args, **kwds) 
  23.             return result 
  24.  
  25.     elif maxsize is None: 
  26.  
  27.         def wrapper(*args, **kwds): 
  28.             # 僅僅排序,不考慮排序和緩存大小限制 
  29.             nonlocal hits, misses 
  30.             key = make_key(args, kwds, typed) 
  31.             result = cache_get(key, sentinel) 
  32.             if result is not sentinel: 
  33.                 hits += 1 
  34.                 return result 
  35.             misses += 1 
  36.             result = user_function(*args, **kwds) 
  37.             cache[key] = result 
  38.             return result 
  39.  
  40.     else
  41.  
  42.         def wrapper(*args, **kwds): 
  43.             # 大小有限制,并跟蹤最近使用的緩存 
  44.             nonlocal root, hits, misses, full 
  45.             key = make_key(args, kwds, typed) 
  46.             with lock: 
  47.                 link = cache_get(key
  48.                 if link is not None: 
  49.                     # 緩存命中,將命中的緩存移動到循環雙向鏈表的頭部 
  50.                     link_prev, link_next, _key, result = link 
  51.                     link_prev[NEXT] = link_next 
  52.                     link_next[PREV] = link_prev 
  53.                     last = root[PREV] 
  54.                     last[NEXT] = root[PREV] = link 
  55.                     link[PREV] = last 
  56.                     link[NEXT] = root 
  57.                     hits += 1 
  58.                     return result 
  59.                 misses += 1 
  60.             result = user_function(*args, **kwds) 
  61.             with lock: 
  62.                 if key in cache: 
  63.                     # 走到這里說明 key 已經放在了緩存,且鎖已經釋放了,鏈表已經更新了,這里什么也不需要做了,最后只需要返回計算的結果就可以了。 
  64.                     pass 
  65.                 elif full
  66.                     # 如果緩存滿了, 使用最老的根節點來存儲新節點就可以了,鏈表上不需要刪除(是不是很聰明) 
  67.                     oldroot = root 
  68.                     oldroot[KEY] = key 
  69.                     oldroot[RESULT] = result 
  70.                     root = oldroot[NEXT
  71.                     oldkey = root[KEY
  72.                     oldresult = root[RESULT] 
  73.                     root[KEY] = root[RESULT] = None 
  74.                      
  75.                     # 最后,我們需要從緩存中清除這個 key,因為它已經無效了。 
  76.                     del cache[oldkey] 
  77.                     # 新值放入緩存 
  78.                     cache[key] = oldroot 
  79.                 else
  80.                     # 如果沒有滿,將新的結果放入循環雙向鏈表的頭部 
  81.                     last = root[PREV] 
  82.                     link = [last, root, key, result] 
  83.                     last[NEXT] = root[PREV] = cache[key] = link 
  84.                     # 使用 cache_len 綁定方法而不是 len() 函數,后者可能會被包裝在 lru_cache 本身中 
  85.                     full = (cache_len() >= maxsize) 
  86.             return result 
  87.  
  88.     def cache_info(): 
  89.         """報告緩存統計信息""" 
  90.         with lock: 
  91.             return _CacheInfo(hits, misses, maxsize, cache_len()) 
  92.  
  93.     def cache_clear(): 
  94.         """清理緩存信息""" 
  95.         nonlocal hits, misses, full 
  96.         with lock: 
  97.             cache.clear() 
  98.             root[:] = [root, root, None, None] 
  99.             hits = misses = 0 
  100.             full = False 
  101.  
  102.     wrapper.cache_info = cache_info 
  103.     wrapper.cache_clear = cache_clear 
  104.     return wrapper 

如果我寫的注釋你都看明白了,那也不用看我下面的廢話了,如果還有點不太明白,我啰嗦幾句,也許你就明白了。

第一、所謂緩存,用的仍然是內存,為了快速存取,用的就是一個 hash 表,也就是 Python 的字典,都是在內存里的操作。

  1. cache = {} 

第二、如果 maxsize == 0,就相當于沒有使用緩存,每調用一次,未命中數就 + 1,代碼邏輯是這樣的:

  1. def wrapper(*args, **kwds): 
  2.     nonlocal misses 
  3.     misses += 1 # 未命中數 
  4.     result = user_function(*args, **kwds) 
  5.     return result 

第三、如果 maxsize == None,相當于緩存無限制,也就不需要考慮淘汰,這個實現非常簡單,我們直接在函數中用一個字典就可以實現,比如說:

  1. cache = {} 
  2. def fib(n): 
  3.  
  4.     if n in cache: 
  5.         return cache[n] 
  6.  
  7.     if n <= 1: 
  8.         return n 
  9.     result = fib(n - 1) + fib(n - 2) 
  10.     cache[n] = result 
  11.     return result 

運行時間:

理解了這一點,在裝飾器中,這段邏輯就不難看懂:

  1. def wrapper(*args, **kwds): 
  2.     nonlocal hits, misses 
  3.     key = make_key(args, kwds, typed) 
  4.     result = cache_get(key, sentinel) 
  5.     if result is not sentinel: 
  6.         hits += 1 
  7.         return result 
  8.     misses += 1 
  9.     result = user_function(*args, **kwds) 
  10.     cache[key] = result 
  11.     return result 

第四、真正的緩存淘汰算法。

為了實現緩存(鍵值對)的淘汰,我們需要對緩存按時間進行排序,這就需要用到鏈表,鏈表的頭部是最新插入的,尾部是最老插入的,當緩存數量已經達到最大值時,我們刪除最久未使用的鏈尾節點,為了不刪除鏈尾,我們可以使用循環鏈表,當緩存滿了,直接更新鏈尾節點賦值為新節點,并把它做為新的鏈頭就可以了。

當緩存命中時,我們需要把這個節點移動到鏈表的頭部,保證鏈表的頭部是最近經常使用的,為了移動方便,我們需要雙向鏈表。

雙向循環鏈表在 Python 中實現,可以簡單的這么寫:

  1. PREV, NEXTKEY, RESULT = 0, 1, 2, 3   # names for the link fields 
  2. root = []                # root of the circular doubly linked list 
  3. root[:] = [root, root, None, None]     # initialize by pointing to self 

可能有些朋友看不懂最后那行代碼:root[:] = [root, root, None, None],畫個圖你就理解了:

這些箭頭指向的都是節點的內存地址,隨著節點的增多,就是這個樣子的:

對比這個圖,再看源代碼,就很容易看懂了。尤其是這塊的代碼邏輯,是面試常考的重點,如果你能手寫出這樣線程安全的 LRU 緩存淘汰算法,那無疑是非常優秀的。

其他 LRU 算法的實現

其他關于 LRU 算法的實現,我自己寫了兩個,可以看這里:

LRU 緩存淘汰算法-雙鏈表+hash 表[1]

LRU 緩存淘汰算法-Python 有序字典[2]

最后的話

裝飾器 lru_cache 的作用就是把函數的計算機結果保存下來,下次用的時候可以直接從 hash 表中取出,避免重復計算從而提升效率,簡單點的,直接在函數中使用個字典就搞定了,復雜點的,請看 lru_cache 的代碼實現。另一方面,遞歸函數慢的一個主要原因就是重復計算。

Python 標準庫的源碼,是學習編程最有營養的原料,當你有好奇心時,不妨去窺探一下源碼,相信你有定會有新的收獲。今天的分享就到這里,如果有收獲的話,請點贊、在看、轉發、關注,感謝你的支持。

參考資料

[1]

LRU 緩存淘汰算法-雙鏈表+hash 表: https://github.com/somenzz/geekbang/blob/master/algorthms/lru_use_link_table.py

[2]

 

LRU 緩存淘汰算法-Python 有序字典: https://github.com/somenzz/geekbang/blob/master/algorthms/lru_use_ordered_dict.py

 

責任編輯:武曉燕 來源: Python七號
相關推薦

2020-10-29 10:00:55

Python函數文件

2021-11-30 08:26:59

C++設計模式

2009-03-24 14:23:59

PHP類庫PHP開發PHP

2012-05-25 14:20:08

JavaScript

2025-02-26 11:05:03

2013-06-14 14:57:09

Java基礎代碼

2012-04-17 09:44:08

JavaScript

2022-06-27 19:01:04

Python應用程序數據

2011-04-06 14:08:14

jQuery

2023-02-19 15:22:22

React技巧

2017-08-02 13:32:18

編程Java程序片段

2010-07-30 09:07:12

PHP函數

2011-07-07 17:16:43

PHP

2020-08-27 10:10:46

NodeJs 軟件Express

2018-08-03 10:02:05

Linux命令

2023-06-13 15:15:02

JavaScript前端編程語言

2022-09-02 23:08:04

JavaScript技巧開發

2021-08-17 10:34:19

Python數據科學機器學習

2013-11-05 10:03:22

Eclipse功能

2013-08-12 15:00:24

LinuxLinux命令
點贊
收藏

51CTO技術棧公眾號

在线视频一区二区免费| 成人av在线播放网址| 亚洲另类xxxx| 日日噜噜噜噜久久久精品毛片| 最新真实国产在线视频| 国产一区二区h| 欧美亚洲国产视频| 午夜激情福利电影| 精品国产导航| 欧美午夜精品免费| 久草视频国产在线| 99免在线观看免费视频高清| 国产成人av一区二区三区在线观看| 国内精品久久久久影院 日本资源| 美女100%无挡| 日本一区二区乱| 日韩欧美亚洲成人| 国产成人生活片| 久草视频在线看| 国产成人亚洲综合色影视| 热久久免费视频精品| 久久久久99精品成人片毛片| 国产欧美日韩影院| 亚洲成人aaa| 91福利免费观看| 欧美男女交配| 亚洲妇女屁股眼交7| 中文字幕中文字幕一区三区| 欧美777四色影视在线| 国产精品1024| 成人黄色av播放免费| 久久高清免费视频| 综合国产精品| 精品国产一区二区三区久久狼5月| 中文字幕xxx| 国产成人一二| 日韩一区二区精品| 国产原创精品在线| 大胆人体一区二区| 婷婷开心久久网| 福利在线小视频| 91露出在线| 国产三级精品在线| 欧美少妇一区| 深夜福利免费在线观看| av电影在线观看不卡| 国产成人精品日本亚洲11| 97人妻一区二区精品免费视频 | youjizz在线视频| 亚洲午夜一级| 色综合久久88| 欧美精品乱码视频一二专区| 香蕉精品视频在线观看| 日韩中文字幕免费| 免费精品在线视频| 999国产精品| 久久久国产精品x99av| 久久99久久99精品免费看小说| 欧美aaaa视频| 久久久国产一区二区| 精品国产精品国产精品| 国产精品久久久久久| 久久亚洲春色中文字幕| 一级片一级片一级片| 中国成人一区| 欧美激情一二区| 久久久久免费看| 在线精品一区二区| 91精品国产91久久久久福利| 国产专区第一页| 爽爽淫人综合网网站| 国产精品高清免费在线观看| 在线亚洲欧美日韩| 激情图片小说一区| 国产精品18毛片一区二区| 日本韩国在线观看| 久久精品在线免费观看| 亚洲国产精品视频一区| 黄在线免费观看| 亚洲综合一二区| 国产妇女馒头高清泬20p多| 午夜av不卡| 欧美日韩国产综合视频在线观看| 国产传媒免费观看| 风间由美一区二区av101| 精品呦交小u女在线| 精品熟妇无码av免费久久| 一个色综合网| 69影院欧美专区视频| 中文字幕视频网| 精品一区二区精品| 国产一区二区三区无遮挡| 黄色小视频在线观看| 亚洲伦在线观看| 免费超爽大片黄| 日本.亚洲电影| 日韩你懂的在线观看| 少妇毛片一区二区三区| 亚洲精品成人| 欧美在线xxx| 中文字幕欧美人妻精品一区蜜臀| 成人一区二区三区| 亚洲精品一卡二卡三卡四卡| 不卡的av影片| 欧美日本韩国一区| 五十路六十路七十路熟婆| 99国内精品久久久久久久| 97在线视频国产| 国产精品系列视频| 久久日韩粉嫩一区二区三区| 91国在线高清视频| 嫩草伊人久久精品少妇av杨幂| 日韩精品专区在线影院观看| 色屁屁草草影院ccyy.com| 在线欧美福利| 亚洲www视频| 国产小视频在线| 亚洲激情欧美激情| 色婷婷成人在线| 亚洲精品456| 欧美国产在线视频| 91午夜交换视频| 欧美国产97人人爽人人喊| 18禁网站免费无遮挡无码中文 | 欧美视频你懂的| 玖玖爱在线精品视频| 99精品美女| 国产精品国产三级国产aⅴ9色| 亚洲欧美综合一区二区| 亚洲综合精品自拍| 91蝌蚪视频在线| 欧美黄色录像片| 国产精品wwwwww| 色综合久久网女同蕾丝边| 亚洲成av人片一区二区| 奇米777在线| 国产国产精品| 国产日韩欧美中文| 成年人视频在线观看免费| 黑人极品videos精品欧美裸| 久久久久成人精品无码中文字幕| 欧美日韩综合| 91丨九色丨国产| а√天堂资源地址在线下载| 欧美夫妻性生活| 欧美爱爱免费视频| 久久99精品一区二区三区三区| 亚洲欧洲日本国产| 成人在线免费| 最近2019中文字幕大全第二页| 高潮毛片又色又爽免费| 久久久美女毛片| 亚洲综合在线网站| 欧美裸体在线版观看完整版| 国产aⅴ夜夜欢一区二区三区 | 中文字幕一区二区三区四区视频| 久久精品亚洲精品国产欧美kt∨| 精品中文字幕av| 亚洲最好看的视频| 国产成人97精品免费看片| 九色在线播放| 欧美日韩一级黄| 黄色录像免费观看| 国产精品99久久久久久久vr| 女人帮男人橹视频播放| 久久婷婷国产| 国产精品精品久久久久久| 午夜小视频在线| 欧美一级高清片| 四虎永久在线精品| 久久久综合视频| 中文字幕永久有效| 欧美日韩免费观看一区=区三区| 国产精品10p综合二区| 天堂√中文最新版在线| 中文字幕视频一区二区在线有码 | 福利电影一区二区三区| 少妇人妻在线视频| 亚洲动漫精品| 91精品久久久久久久久久久久久 | 国产精品久久久久久婷婷天堂 | 97精品久久久中文字幕免费| 国产在线观看黄| 91精品国产一区二区三区| 久久高清无码视频| 久久蜜桃一区二区| 九九热视频免费| 99精品免费| 一区二区视频国产| 女同另类激情重口| 国产精品视频久久久久| 精品精品导航| 国产香蕉97碰碰久久人人| 99精品在线视频观看| 天天操天天综合网| 少妇高潮惨叫久久久久| 成人福利视频网站| 成人性生交免费看| 99伊人成综合| 免费久久久久久| 最新亚洲精品| 福利视频久久| 日韩成人在线一区| 26uuu另类亚洲欧美日本老年| 91caoporn在线| 亚洲激情中文字幕| 97成人在线观看| 日韩欧美一区二区三区久久| 成人免费精品动漫网站| 久久丝袜美腿综合| 国产精品熟妇一区二区三区四区| 蜜臀av亚洲一区中文字幕| 男人天堂新网址| 久久亚洲国产| 欧美久久综合性欧美| 亚洲综合影院| 成人在线小视频| 午夜无码国产理论在线| 欧美精品久久久久久久| 婷婷五月在线视频| 亚洲欧美日韩国产成人| 欧美自拍偷拍第一页| 欧美疯狂性受xxxxx喷水图片| 日本免费在线观看视频| 午夜欧美2019年伦理| 国产日韩欧美在线观看视频| 日本一区二区成人| 国产人妻一区二区| 91丝袜呻吟高潮美腿白嫩在线观看| 精品国产午夜福利在线观看| 麻豆视频观看网址久久| 999在线免费视频| 免费日韩精品中文字幕视频在线| www精品久久| 国户精品久久久久久久久久久不卡| 亚洲在线色站| 欧美丝袜丝交足nylons172| 久久久久久99| 日韩理论电影中文字幕| 国产一级特黄a大片99| 99久久香蕉| 国产成人亚洲欧美| 91精品丝袜国产高跟在线| 99久热re在线精品视频| 日韩精品亚洲专区在线观看| 91在线视频成人| 国产精品一区二区美女视频免费看 | 女性裸体视频网站| 中文av一区二区| av资源在线免费观看| 欧美国产欧美综合| 夜夜春很很躁夜夜躁| 国产精品欧美经典| 国产一区在线观看免费| 亚洲丝袜精品丝袜在线| 午夜写真片福利电影网| 亚洲一区二区三区四区在线观看| 岛国毛片在线观看| 性久久久久久久久| 91香蕉在线视频| 狠狠久久亚洲欧美专区| 无码一区二区三区在线观看| 欧美性生活一区| 国产免费一区二区三区最新不卡 | 亚洲av无一区二区三区久久| 国产成人av影院| 国产精品伦子伦| 久久久综合网站| 国产又粗又长免费视频| 亚洲少妇最新在线视频| 久久久久久久久久99| 激情久久av一区av二区av三区| 欧美啪啪小视频| 欧美性大战xxxxx久久久| 亚洲在线观看av| 欧美mv日韩mv国产网站| 欧美女v视频| 最近2019中文字幕第三页视频 | 日本韩国免费观看| 亚洲天堂男人天堂| 国产一区久久精品| 性亚洲最疯狂xxxx高清| 成人黄色视屏网站| 91精品黄色| 男男gay无套免费视频欧美| 一区二区视频在线观看| 亚洲美女色禁图| 三级a三级三级三级a十八发禁止| 国产精品一二三区在线| 久久av无码精品人妻系列试探| 亚洲视频 欧洲视频| 日韩黄色在线播放| 91精品国产福利在线观看 | av不卡在线播放| 懂色av粉嫩av蜜臀av一区二区三区| 亚洲一区在线观看免费观看电影高清 | 国产精品免费观看| 超碰精品一区二区三区乱码| 成人爱爱网址| 99re在线观看视频| 国产欧美日韩| 国产免费黄色小视频| 久草精品在线观看| 中文字幕丰满乱子伦无码专区| 亚洲婷婷综合久久一本伊一区 | 3751色影院一区二区三区| 亚洲 欧美 自拍偷拍| 久久精品国产综合| 波多视频一区| 国产精品对白一区二区三区| 欧美xxav| 精品www久久久久奶水| 国产成人h网站| 三级黄色免费观看| 在线视频综合导航| 香蕉视频免费在线看| 久久99热精品这里久久精品| 久久久加勒比| 青娱乐国产91| 99成人精品| 极品白嫩少妇无套内谢| 中文字幕一区免费在线观看| 日本一本在线观看| 日韩久久精品电影| 大香伊人中文字幕精品| 超碰97网站| 最新国产精品| 日韩在线一区视频| 国产精品久久久久久户外露出| 老熟妇仑乱一区二区av| 亚洲精品乱码久久久久久按摩观| 丝袜国产在线| 亚洲综合中文字幕在线观看| 亚洲影视一区| 亚洲理论中文字幕| 亚洲天堂2014| 国产精品久久久久久久久久久久久久久久久久| 亚洲日韩中文字幕| 亚洲精品永久免费视频| 久久综合给合久久狠狠色| 亚洲激情午夜| 你懂的在线观看网站| 偷偷要91色婷婷| 天天色天天操天天射| 88xx成人精品| 久久91麻豆精品一区| 成人久久久久久久久| 久久久久久久久97黄色工厂| 色老头在线视频| 日韩一级裸体免费视频| 日本免费在线一区| 国产又粗又爽又黄的视频| 国产麻豆视频一区二区| 欧美丰满艳妇bbwbbw| 亚洲第一精品夜夜躁人人躁| 中文字幕在线免费观看视频| 日韩黄色影视| 久久99精品久久久久久久久久久久| 看黄色录像一级片| 日韩欧美在线123| 123区在线| 日本视频一区二区在线观看| 男人的j进女人的j一区| 三级av在线免费观看| 精品免费99久久| 亚洲美女尤物影院| 亚洲高清视频一区二区| 韩国成人精品a∨在线观看| 久草网站在线观看| 亚洲精品久久久久| 天天综合网站| 操bbb操bbb| 91玉足脚交白嫩脚丫在线播放| 亚洲av无码精品一区二区| 日韩一区视频在线| 9999久久久久| 黄色av免费在线播放| 亚洲欧美另类久久久精品| a天堂在线观看视频| 91成人在线视频| 99精品电影| 亚洲av无码一区二区三区网址| 欧美系列日韩一区| 亚洲wwwww| 日韩aⅴ视频一区二区三区| 黄页视频在线91| 日韩精品在线不卡| 视频在线一区二区| 高清精品xnxxcom| 91激情视频在线| 一区二区三区资源| 国产青青草在线| 99国产超薄肉色丝袜交足的后果| 午夜在线播放视频欧美| www日韩在线| 亚洲性日韩精品一区二区| 久久国产精品美女| 国产97色在线 | 日韩| 一区二区三区波多野结衣在线观看 | 国产成人在线网站|