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

為什么有些時候 Python 中乘法比位運算更快

開發 后端
某天,一個技術群里老哥提出了這樣一個問題,為什么在一些情況下,Python 中的簡單乘/除法比位運算要慢。

我本來以為我不再會寫水文了,但是突然發現自己現在也只能勉強寫寫水文才能維持生活這樣子。那就繼續寫水文吧!

某天,一個技術群里老哥提出了這樣一個問題,為什么在一些情況下,Python 中的簡單乘/除法比位運算要慢。

首先秉持著實事求是的精神,我們先來驗證一下:

  1. In [33]: %timeit 1073741825*2                                                                                                                                                                                                                                                                            
  2. 7.47 ns ± 0.0843 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each) 
  3.  
  4. In [34]: %timeit 1073741825<<1                                                                                                                                                                                                                                                                           
  5. 7.43 ns ± 0.0451 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each) 
  6.  
  7. In [35]: %timeit 1073741823<<1                                                                                                                                                                                                                                                                           
  8. 7.48 ns ± 0.0621 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each) 
  9.  
  10. In [37]: %timeit 1073741823*2                                                                                                                                                                                                                                                                            
  11. 7.47 ns ± 0.0564 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each) 

我們發現幾個很有趣的現象:

  • 在值 x<=2^30 時,乘法比直接位運算要快
  • 在值 x>2^32 時,乘法顯著慢于位運算

這個現象很有趣,那么這個現象的 root cause 是什么?實際上這和 Python 底層的實現有關。

簡單聊聊

1. PyLongObject 的實現

在 Python 2.x 時期,Python 中將整型分為兩類,一類是 long, 一類是 int 。在 Python3 中這兩者進行了合并。目前在 Python3 中這兩者做了合并,僅剩一個 long。

首先來看看 long 這樣一個數據結構底層的實現:

  1. struct _longobject { 
  2.     PyObject_VAR_HEAD 
  3.     digit ob_digit[1]; 
  4. }; 

在這里不用關心,PyObject_VAR_HEAD 的含義,我們只需要關心 ob_digit 即可。

在這里,ob_digit 是使用了 C99 中的“柔性數組”來實現任意長度的整數的存儲。這里我們可以看一下官方代碼中的文檔:

Long integer representation.The absolute value of a number is equal to SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) Negative numbers are represented with ob_size < 0; zero is represented by ob_size == 0. In a normalized number, ob_digit[abs(ob_size)-1] (the most significant digit) is never zero. Also, in all cases, for all valid i,0 <= ob_digit[i] <= MASK. The allocation function takes care of allocating extra memory so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. CAUTION: Generic code manipulating subtypes of PyVarObject has to aware that ints abuse ob_size's sign bit.

簡而言之,Python 是將一個十進制數轉為 2^(SHIFT) 進制數來進行存儲。這里可能不太好了理解。我來舉個例子,在我的電腦上,SHIFT 為 30 ,假設現在有整數 1152921506754330628 ,那么將其轉為 2^30 進制表示則為: 4*(2^30)^0+2*(2^30)^1+1*(2^30)^2 。那么此時 ob_digit 是一個含有三個元素的數組,其值為 [4,2,1]。

OK,在明白了這樣一些基礎知識后,我們回過頭去看看 Python 中的乘法運算。

2. Python 中的乘法運算

Python 中的乘法運算,分為兩部分,其中關于大數的乘法,Python 使用了 Karatsuba 算法1,具體實現如下:

  1. static PyLongObject * 
  2. k_mul(PyLongObject *a, PyLongObject *b) 
  3.     Py_ssize_t asize = Py_ABS(Py_SIZE(a)); 
  4.     Py_ssize_t bsize = Py_ABS(Py_SIZE(b)); 
  5.     PyLongObject *ah = NULL
  6.     PyLongObject *al = NULL
  7.     PyLongObject *bh = NULL
  8.     PyLongObject *bl = NULL
  9.     PyLongObject *ret = NULL
  10.     PyLongObject *t1, *t2, *t3; 
  11.     Py_ssize_t shift;           /* the number of digits we split off */ 
  12.     Py_ssize_t i; 
  13.  
  14.     /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl 
  15.      * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh  + ah*bh + al*bl 
  16.      * Then the original product is 
  17.      *     ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl 
  18.      * By picking X to be a power of 2, "*X" is just shifting, and it's 
  19.      * been reduced to 3 multiplies on numbers half the size. 
  20.      */ 
  21.  
  22.     /* We want to split based on the larger number; fiddle so that b 
  23.      * is largest. 
  24.      */ 
  25.     if (asize > bsize) { 
  26.         t1 = a
  27.         a = b
  28.         b = t1
  29.  
  30.         i = asize
  31.         asize = bsize
  32.         bsize = i; 
  33.     } 
  34.  
  35.     /* Use gradeschool math when either number is too small. */ 
  36.     i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF; 
  37.     if (asize <= i) { 
  38.         if (asize == 0) 
  39.             return (PyLongObject *)PyLong_FromLong(0); 
  40.         else 
  41.             return x_mul(a, b); 
  42.     } 
  43.  
  44.     /* If a is small compared to b, splitting on b gives a degenerate 
  45.      * case with ah==0, and Karatsuba may be (even much) less efficient 
  46.      * than "grade school" then.  However, we can still win, by viewing 
  47.      * b as a string of "big digits", each of width a->ob_size.  That 
  48.      * leads to a sequence of balanced calls to k_mul. 
  49.      */ 
  50.     if (2 * asize <= bsize) 
  51.         return k_lopsided_mul(a, b); 
  52.  
  53.     /* Split a & b into hi & lo pieces. */ 
  54.     shift = bsize >> 1; 
  55.     if (kmul_split(a, shift, &ah, &al) < 0) goto fail; 
  56.     assert(Py_SIZE(ah) > 0);            /* the split isn't degenerate */ 
  57.  
  58.     if (a == b) { 
  59.         bh = ah
  60.         bl = al
  61.         Py_INCREF(bh); 
  62.         Py_INCREF(bl); 
  63.     } 
  64.     else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail; 
  65.  
  66.     /* The plan: 
  67.      * 1. Allocate result space (asize + bsize digits:  that's always 
  68.      *    enough). 
  69.      * 2. Compute ah*bh, and copy into result at 2*shift. 
  70.      * 3. Compute al*bl, and copy into result at 0.  Note that this 
  71.      *    can't overlap with #2. 
  72.      * 4. Subtract al*bl from the result, starting at shift.  This may 
  73.      *    underflow (borrow out of the high digit), but we don't care: 
  74.      *    we're effectively doing unsigned arithmetic mod 
  75.      *    BASE**(sizea + sizeb), and so long as the *final* result fits, 
  76.      *    borrows and carries out of the high digit can be ignored. 
  77.      * 5. Subtract ah*bh from the result, starting at shift. 
  78.      * 6. Compute (ah+al)*(bh+bl), and add it into the result starting 
  79.      *    at shift. 
  80.      */ 
  81.  
  82.     /* 1. Allocate result space. */ 
  83.     ret = _PyLong_New(asize + bsize); 
  84.     if (ret == NULL) goto fail; 
  85. #ifdef Py_DEBUG 
  86.     /* Fill with trash, to catch reference to uninitialized digits. */ 
  87.     memset(ret->ob_digit, 0xDF, Py_SIZE(ret) * sizeof(digit)); 
  88. #endif 
  89.  
  90.     /* 2. t1 <- ah*bh, and copy into high digits of result. */ 
  91.     if ((t1 = k_mul(ah, bh)) == NULL) goto fail; 
  92.     assert(Py_SIZE(t1) >= 0); 
  93.     assert(2*shift + Py_SIZE(t1) <= Py_SIZE(ret)); 
  94.     memcpy(ret->ob_digit + 2*shift, t1->ob_digit, 
  95.            Py_SIZE(t1) * sizeof(digit)); 
  96.  
  97.     /* Zero-out the digits higher than the ah*bh copy. */ 
  98.     i = Py_SIZE(ret) - 2*shift - Py_SIZE(t1); 
  99.     if (i) 
  100.         memset(ret->ob_digit + 2*shift + Py_SIZE(t1), 0, 
  101.                i * sizeof(digit)); 
  102.  
  103.     /* 3. t2 <- al*bl, and copy into the low digits. */ 
  104.     if ((t2 = k_mul(al, bl)) == NULL) { 
  105.         Py_DECREF(t1); 
  106.         goto fail; 
  107.     } 
  108.     assert(Py_SIZE(t2) >= 0); 
  109.     assert(Py_SIZE(t2) <= 2*shift); /* no overlap with high digits */ 
  110.     memcpy(ret->ob_digit, t2->ob_digit, Py_SIZE(t2) * sizeof(digit)); 
  111.  
  112.     /* Zero out remaining digits. */ 
  113.     i = 2*shift - Py_SIZE(t2);          /* number of uninitialized digits */ 
  114.     if (i) 
  115.         memset(ret->ob_digit + Py_SIZE(t2), 0, i * sizeof(digit)); 
  116.  
  117.     /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2).  We do al*bl first 
  118.      * because it's fresher in cache. 
  119.      */ 
  120.     i = Py_SIZE(ret) - shift;  /* # digits after shift */ 
  121.     (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, Py_SIZE(t2)); 
  122.     Py_DECREF(t2); 
  123.  
  124.     (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, Py_SIZE(t1)); 
  125.     Py_DECREF(t1); 
  126.  
  127.     /* 6. t3 <- (ah+al)(bh+bl), and add into result. */ 
  128.     if ((t1 = x_add(ah, al)) == NULL) goto fail; 
  129.     Py_DECREF(ah); 
  130.     Py_DECREF(al); 
  131.     ah = al = NULL; 
  132.  
  133.     if (a == b) { 
  134.         t2 = t1
  135.         Py_INCREF(t2); 
  136.     } 
  137.     else if ((t2 = x_add(bh, bl)) == NULL) { 
  138.         Py_DECREF(t1); 
  139.         goto fail; 
  140.     } 
  141.     Py_DECREF(bh); 
  142.     Py_DECREF(bl); 
  143.     bh = bl = NULL; 
  144.  
  145.     t3 = k_mul(t1, t2); 
  146.     Py_DECREF(t1); 
  147.     Py_DECREF(t2); 
  148.     if (t3 == NULL) goto fail; 
  149.     assert(Py_SIZE(t3) >= 0); 
  150.  
  151.     /* Add t3.  It's not obvious why we can't run out of room here. 
  152.      * See the (*) comment after this function. 
  153.      */ 
  154.     (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, Py_SIZE(t3)); 
  155.     Py_DECREF(t3); 
  156.  
  157.     return long_normalize(ret); 
  158.  
  159.   fail: 
  160.     Py_XDECREF(ret); 
  161.     Py_XDECREF(ah); 
  162.     Py_XDECREF(al); 
  163.     Py_XDECREF(bh); 
  164.     Py_XDECREF(bl); 
  165.     return NULL; 

這里不對 Karatsuba 算法1 的實現做單獨解釋,有興趣的朋友可以參考文末的 reference 去了解具體的詳情。

在普通情況下,普通乘法的時間復雜度為 n^2 (n 為位數),而 K 算法的時間復雜度為 3n^(log3) ≈ 3n^1.585 ,看起來 K 算法的性能要優于普通乘法,那么為什么 Python 不全部使用 K 算法呢?

很簡單,K 算法的優勢實際上要在當 n 足夠大的時候,才會對普通乘法形成優勢。同時考慮到內存訪問等因素,當 n 不夠大時,實際上采用 K 算法的性能將差于直接進行乘法。

所以我們來看看 Python 中乘法的實現:

  1. static PyObject * 
  2. long_mul(PyLongObject *a, PyLongObject *b) 
  3.     PyLongObject *z; 
  4.  
  5.     CHECK_BINOP(a, b); 
  6.  
  7.     /* fast path for single-digit multiplication */ 
  8.     if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) { 
  9.         stwodigits v = (stwodigits)(MEDIUM_VALUE(a)) * MEDIUM_VALUE(b); 
  10.         return PyLong_FromLongLong((long long)v); 
  11.     } 
  12.  
  13.     z = k_mul(a, b); 
  14.     /* Negate if exactly one of the inputs is negative. */ 
  15.     if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z) { 
  16.         _PyLong_Negate(&z); 
  17.         if (z == NULL) 
  18.             return NULL; 
  19.     } 
  20.     return (PyObject *)z; 

在這里我們看到,當兩個數皆小于 2^30-1 時,Python 將直接使用普通乘法并返回,否則將使用 K 算法進行計算

這個時候,我們來看一下位運算的實現,以右移為例:

  1. static PyObject * 
  2. long_rshift(PyObject *a, PyObject *b) 
  3.     Py_ssize_t wordshift; 
  4.     digit remshift; 
  5.  
  6.     CHECK_BINOP(a, b); 
  7.  
  8.     if (Py_SIZE(b) < 0) { 
  9.         PyErr_SetString(PyExc_ValueError, "negative shift count"); 
  10.         return NULL; 
  11.     } 
  12.     if (Py_SIZE(a) == 0) { 
  13.         return PyLong_FromLong(0); 
  14.     } 
  15.     if (divmod_shift(b, &wordshift, &remshift) < 0
  16.         return NULL; 
  17.     return long_rshift1((PyLongObject *)a, wordshift, remshift); 
  18.  
  19. static PyObject * 
  20. long_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift) 
  21.     PyLongObject *z = NULL
  22.     Py_ssize_t newsize, hishift, i, j; 
  23.     digit lomask, himask; 
  24.  
  25.     if (Py_SIZE(a) < 0) { 
  26.         /* Right shifting negative numbers is harder */ 
  27.         PyLongObject *a1, *a2; 
  28.         a1 = (PyLongObject *) long_invert(a); 
  29.         if (a1 == NULL) 
  30.             return NULL; 
  31.         a2 = (PyLongObject *) long_rshift1(a1, wordshift, remshift); 
  32.         Py_DECREF(a1); 
  33.         if (a2 == NULL) 
  34.             return NULL; 
  35.         z = (PyLongObject *) long_invert(a2); 
  36.         Py_DECREF(a2); 
  37.     } 
  38.     else { 
  39.         newsize = Py_SIZE(a) - wordshift; 
  40.         if (newsize <= 0) 
  41.             return PyLong_FromLong(0); 
  42.         hishift = PyLong_SHIFT - remshift; 
  43.         lomask = ((digit)1 << hishift) - 1; 
  44.         himask = PyLong_MASK ^ lomask; 
  45.         z = _PyLong_New(newsize); 
  46.         if (z == NULL) 
  47.             return NULL; 
  48.         for (i = 0j = wordshift; i < newsize; i++, j++) { 
  49.             z->ob_digit[i] = (a->ob_digit[j] >> remshift) & lomask; 
  50.             if (i+1 < newsize
  51.                 z->ob_digit[i] |= (a->ob_digit[j+1] << hishift) & himask; 
  52.         } 
  53.         z = maybe_small_long(long_normalize(z)); 
  54.     } 
  55.     return (PyObject *)z; 

在這里我們能看到,在兩側都是小數的情況下,位移動算法將比普通乘法,存在更多的內存分配等操作。這樣也會回答了我們文初所提到的一個問題,“為什么一些時候乘法比位運算更快”。

總結本文差不多就到這里了,實際上通過這次分析我們能得到一些很有趣但是也很冷門的知識。實際上我們目前看到這樣一個結果,是 Python 對于我們常見且高頻的操作所做的一個特定的設計。而這也提醒我們,Python 實際上對于很多操作都存在自己內建的設計哲學,在日常使用的時候,其余語言的經驗,可能無法復用。

 

責任編輯:趙寧寧 來源: Manjusaka的編程屋
相關推薦

2021-01-13 10:51:08

PromissetTimeout(函數

2023-09-14 15:48:53

排序測試

2023-09-20 00:06:30

Python代碼函數

2013-07-24 09:47:52

語言語速環境語言

2025-09-22 08:12:57

2012-08-23 09:28:01

編程編程語言

2021-04-23 11:11:59

加密貨幣硬幣數字貨幣

2021-01-30 10:51:07

Python編程語言開發

2021-07-23 16:30:36

PythonC++代碼

2014-08-29 09:56:47

排序數組編程技巧

2015-08-06 12:50:47

技術人員博客

2020-09-15 09:55:30

類比Python開發

2022-11-10 15:32:29

2024-02-05 22:51:49

AGIRustPython

2019-09-16 12:00:03

constC編程語言

2020-07-17 19:31:19

PythonR編程

2020-02-14 13:53:33

Python 開發編程語言

2015-07-31 16:29:15

DockerJavaLinux

2021-12-27 07:10:26

ClassmethodStaticmetho函數

2019-04-24 08:00:00

HTTPSHTTP前端
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品电影在线观看| 亚洲高清免费观看| 成人日韩av在线| 免费在线观看亚洲| 精品人人人人| 欧美亚洲精品一区| 日本免费成人网| 国产一二三区在线| 国产传媒久久文化传媒| 欧美亚洲伦理www| 中文字幕在线观看二区| 永久免费精品视频| 欧美制服丝袜第一页| 日本中文字幕一级片| 四虎在线视频免费观看| 免费不卡在线视频| 91成人在线观看国产| 午夜国产小视频| 亚洲精品国模| 精品日韩一区二区三区| 在线观看免费成人av| 久草在线视频网站| 国产精品午夜电影| 精品国产免费久久久久久尖叫 | 欧美日韩国产高清| 精品五月天久久| 又色又爽又黄18网站| 成人在线视频免费| 日韩欧美999| www.av片| 欧美aaaxxxx做受视频| 国产精品九色蝌蚪自拍| 欧美日韩视频在线一区二区观看视频 | 国产视频福利在线| 东方aⅴ免费观看久久av| 国产欧美va欧美va香蕉在| 波多野结衣视频网站| 欧美激情综合色综合啪啪| 日韩在线观看视频免费| 中文字幕第4页| 色婷婷精品视频| 亚洲国产欧美一区| 精品伦一区二区三区| www欧美在线观看| 欧美日韩午夜精品| 91国产精品视频在线观看| 成人av三级| 日韩欧美国产网站| 91av资源网| 国产乱码午夜在线视频| 亚洲高清在线精品| 国产日韩亚洲欧美在线| 亚洲丝袜精品| 一区二区不卡在线播放 | 欧美色图12p| 国产精品免费成人| 欧美大胆成人| 91久久精品一区二区| 国产v亚洲v天堂无码久久久| 成人性生交大片免费观看网站| 激情亚洲一区二区三区四区| 日韩精品 欧美| 日韩激情电影| 日韩欧美在线免费| 成年人黄色片视频| 欧美日韩视频免费观看| 91成人国产精品| 色噜噜狠狠一区二区| 四虎地址8848精品| 欧美一卡2卡3卡4卡| 一级全黄裸体片| 国产另类在线| 国产丝袜一区二区三区| 免费福利视频网站| 亚洲破处大片| 欧美激情影音先锋| 久久青青草原亚洲av无码麻豆| 视频在线观看一区二区三区| 国产精品亚洲激情| 99免费在线视频| 成人国产在线观看| 欧美自拍资源在线| 毛片在线播放a| 亚洲制服丝袜av| 欧美色图另类小说| 欧美a视频在线| 日韩精品中文字幕一区二区三区 | 99精品视频播放| 成人国产在线| 欧美mv日韩mv| 婷婷色一区二区三区| 91综合久久| 久久久欧美精品| 亚洲中文字幕无码爆乳av | 亚洲一区亚洲二区| 人妻偷人精品一区二区三区| 日本一区二区三区dvd视频在线| 欧美爱爱视频网站| 色偷偷色偷偷色偷偷在线视频| 欧美视频在线一区| 亚洲一区二区三区黄色| 欧美丝袜激情| 久久久人成影片一区二区三区| 黄色网址中文字幕| 国产91精品精华液一区二区三区| 欧美日韩一区二区视频在线观看| 国产在线看片| 日本精品视频一区二区三区| 亚洲av无码久久精品色欲| 国产亚洲一卡2卡3卡4卡新区| 欧美精品在线第一页| 国产一区二区视频网站| 国产suv一区二区三区88区| 日韩精品一区二区三区四区五区| 中文在线字幕免费观看| 欧洲av一区二区嗯嗯嗯啊| 美女伦理水蜜桃4| 93在线视频精品免费观看| 欧美孕妇与黑人孕交| 亚洲国产精品久久人人爱潘金莲| 国产欧美精品在线观看| 蜜臀av无码一区二区三区| 91成人福利社区| 在线观看日韩视频| 天天操天天摸天天干| 国产成人av电影在线| 夜夜爽99久久国产综合精品女不卡| 小视频免费在线观看| 精品成人一区二区| 欧美丰满艳妇bbwbbw| 久久精品av麻豆的观看方式| 欧美乱偷一区二区三区在线| heyzo中文字幕在线| 欧美一区二区福利在线| 成人18视频免费69| 青草av.久久免费一区| 欧美日韩精品一区| 在线天堂资源| 日韩成人在线视频| 国产欧美日韩另类| 成人午夜大片免费观看| 日本aa在线观看| 日韩精品视频一区二区三区| 久久伊人精品天天| 99久久夜色精品国产亚洲| 国产精品白丝在线| 亚洲精品综合在线观看| 91一区二区三区四区| 国产日韩欧美另类| 麻豆网站视频在线观看| 欧美日韩和欧美的一区二区| 国产视频不卡在线| 美女尤物国产一区| 伊人久久青草| 91精品国产一区二区在线观看| 色偷偷偷亚洲综合网另类| 中文字幕码精品视频网站| 欧美极品xxx| 老司机午夜性大片| 91精品综合久久久久久久久久久 | 久久a爱视频| 欧美在线xxx| 大地资源中文在线观看免费版| 欧美日韩你懂的| 精品无码一区二区三区蜜臀| 国产成人免费在线观看| 国产精品成人久久电影| 三级小说欧洲区亚洲区| 国产精品爱久久久久久久| 瑟瑟视频在线| 精品国内二区三区| 日韩精品在线免费视频| 久久久久久久免费视频了| 青青青在线视频免费观看| 国产精品国产三级国产在线观看| 亚洲a成v人在线观看| 91桃色在线观看| 亚洲四色影视在线观看| 91国内精品视频| 亚洲国产精品久久久久婷婷884| 亚洲一区二区三区四区五区六区| 久久国产精品毛片| 最新不卡av| 国产香蕉精品| 国产精品白嫩美女在线观看| 18+视频在线观看| 日韩高清免费观看| 97超视频在线观看| 午夜在线电影亚洲一区| 亚洲精品视频网址| 国产69精品久久777的优势| 成人小视频在线看| 亚洲色图欧美| 欧美一级日本a级v片| 国产视频网站一区二区三区| 91av在线精品| 看黄网站在线| 精品视频一区在线视频| 国产精品爽爽久久久久久| 精品福利在线观看| 久久精品一区二区三区四区五区| www.激情成人| 亚洲天堂伊人网| 国产精品毛片在线看| 做爰高潮hd色即是空| 色爱av综合网| 国产精品9999久久久久仙踪林| 惠美惠精品网| 久久久久中文字幕2018| 男人的天堂在线视频免费观看| 日韩av中文字幕在线播放| 97在线公开视频| 色94色欧美sute亚洲线路一ni | 亚洲美女啪啪| 热这里只有精品| 国产一区二区三区站长工具| 国产精品一国产精品最新章节| 日韩成人一区| 国产大片精品免费永久看nba| 美足av综合网| 久久综合免费视频| 午夜视频在线免费观看| 亚洲欧美日本精品| 天堂成人在线观看| 欧美成人性战久久| 国产免费叼嘿网站免费| 欧美日韩精品免费观看视频| 亚洲影院在线播放| 亚洲国产精品视频| 欧美三级免费看| 国产精品毛片高清在线完整版| 国产精品边吃奶边做爽| 成人午夜电影久久影院| 色姑娘综合天天| 精品综合免费视频观看| 亚洲最大成人在线观看| 天堂一区二区在线| 欧美 国产 综合| 亚洲激情欧美| 黄页网站在线观看视频| 亚洲国产日韩欧美一区二区三区| 毛片在线视频观看| 欧美影视一区| 日本一级淫片演员| 亚洲五月综合| 无颜之月在线看| 亚洲欧美文学| 欧美在线观看视频免费| 欧美午夜精品| 国产一级爱c视频| 一本久道久久久| 亚洲乱码中文字幕久久孕妇黑人| 国产精品久久久免费| 亚洲中文字幕无码不卡电影| 国产亚洲成人一区| 免费在线观看日韩视频| 视频一区二区中文字幕| 欧美一级特黄a| 国产在线麻豆精品观看| 色哟哟免费视频| 成人福利电影精品一区二区在线观看| 亚洲午夜久久久久久久久| av中文字幕不卡| 30一40一50老女人毛片| 国产日韩亚洲欧美综合| 啪啪一区二区三区| 亚洲免费成人av| 国产91av视频| 欧美性xxxx极品高清hd直播| 黄色网址中文字幕| 欧美一区二区三区在线电影 | 亚洲视频专区在线| 午夜视频在线看| 欧美激情亚洲综合一区| 黄色成人免费网| 96国产粉嫩美女| 成午夜精品一区二区三区软件| 久久久久久国产精品一区| 欧美视频免费| 黄色三级中文字幕| 久久精品麻豆| 亚洲精品乱码久久久久久动漫| 成人在线综合网| 无码少妇精品一区二区免费动态| 18涩涩午夜精品.www| 国产无精乱码一区二区三区| 在线影院国内精品| 亚洲精品久久久狠狠狠爱| 精品爽片免费看久久| 久草免费在线| 欧美一级高清免费| 亚洲二区av| 久久久水蜜桃| 91精品啪在线观看国产81旧版 | 日本不卡免费高清视频在线| 欧美一级片在线播放| 日韩av电影资源网| av资源站久久亚洲| 精品美女久久| 青草视频在线观看视频| 美女免费视频一区| 97人妻精品一区二区三区免费| 中文一区在线播放| 日本熟妇毛茸茸丰满| 精品1区2区3区| 少妇一区二区三区四区| 日韩天堂在线视频| 中文在线资源| 高清国产在线一区| 国产精品成人a在线观看| 自慰无码一区二区三区| 国产精品一区二区久久精品爱涩| www.av欧美| 亚洲成a人片综合在线| 在线免费看av片| 亚洲人a成www在线影院| 波多野结衣中文在线| 成人黄色免费片| sdde在线播放一区二区| 漂亮人妻被中出中文字幕| 国产激情视频一区二区三区欧美| 538精品视频| 欧美日韩一区二区免费在线观看| 国产丰满美女做爰| 精品国产区一区二区三区在线观看| 特黄毛片在线观看| 国产日产精品一区二区三区四区| 亚洲成av人片乱码色午夜| 国产 porn| 久久久久久97三级| 日韩经典在线观看| 精品三级在线看| 毛片网站在线看| 97免费高清电视剧观看| 欧美一区成人| 国内精品国产三级国产aⅴ久| 国产精品久99| 91九色蝌蚪91por成人| 深夜福利国产精品| 欧美a视频在线| 中文字幕成人一区| 久久er99热精品一区二区| 成人性生交大片免费看无遮挡aⅴ| 日韩欧美成人精品| 久久久久久女乱国产| 日本国产精品视频| 亚洲精品合集| 三级a在线观看| 中文字幕国产精品一区二区| 日韩国产成人在线| 色999日韩欧美国产| 日韩毛片网站| 欧美xxxx吸乳| 国产91丝袜在线播放九色| 免费人成视频在线| 欧美成人一区二区三区在线观看| 性xxxxfjsxxxxx欧美| 国产精品久久久久久久天堂第1集| 好看不卡的中文字幕| youjizz.com国产| 天天色天天爱天天射综合| 日本ー区在线视频| 国产福利成人在线| 国产韩国精品一区二区三区| 久久综合桃花网| 亚洲高清免费在线| 九色在线播放| 国产伊人精品在线| 欧美日韩日本国产亚洲在线 | 中文字幕欧美区| 中文字幕理论片| 久热精品视频在线观看一区| 成人高潮视频| 国产麻花豆剧传媒精品mv在线| 欧美国产综合一区二区| 国产麻豆91视频| 国内精品视频在线| 黑丝美女一区二区| www.51色.com| 五月天激情综合| 国产大片在线免费观看| 91精品入口蜜桃| 久久激情一区| 国产va在线播放| 亚洲精品视频播放| 国产亚洲精aa在线看| 男人用嘴添女人下身免费视频| 国产欧美视频在线观看| 99久久精品无免国产免费| 78m国产成人精品视频| 91日韩欧美| 999精品免费视频| 欧美日韩成人激情| av漫画网站在线观看| 亚洲国产精品一区二区第一页 | 久久午夜精品| 精品国产精品国产精品| 亚洲欧美综合图区| 网站一区二区| 四季av一区二区三区|