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

如何把C/C++程序編譯成實用的Python模塊

新聞 前端
在Python遇到性能瓶頸時怎么辦?答案是找對應功能的C/C++程序,把它編譯成CPython模塊,供Python調用來提高性能。

 

在Python遇到性能瓶頸時怎么辦?答案是找對應功能的C/C++程序,把它編譯成CPython模塊,供Python調用來提高性能。

如何把C/C++程序編譯成Python模塊

比如Python中做科學計算,數據處理的Numpy模塊就是使用C語言編寫的,Numpy處理速度比Pandas快數倍。Numpy的處理速度一點都不比go語言差。

本文就是介紹如何把C/C++程序編譯成Python模塊。本文偏技術,需要耐著性質看。

Python 作為一個膠水語言,可以很方便的通過C/C++來進行擴展,提高性能。前面我寫了一篇文章介紹如何通過Python的ctypes加載普通的.so庫。

其實,這還不算真正的用C/C++寫Python的擴展模塊。

本文將介紹如何使用C語言和C++寫Python模塊。

一、Python的C語言接口

Python語言最初是用C語言實現的一種腳本語言,后來被稱為CPython,是因為后來它語言實現的Python,比如Python實現的Python——PyPy,Java語言實現的Python——Jython,.Net實現的Python——IronPython。

CPython具有優良的開放性和可擴展性,并提供了方便靈活的應用程序接口(API),從而使得C/C++程序員能夠對Python解釋器的功能進行擴展。

Python的C語言接口很適合封裝C語言實現的各種函數,如果要封裝C++的類,使用boost_python或者SWIG更方便和合適,還有一個類似boost_python的支持C++11的pybind11。

1 模塊封裝

假設我們有一個C函數:

  1. /* 文件名:mylib.c */ 
  2. int addone(int a) { 
  3.  return a+1; 

如果想在Python解釋器中調用該函數,則應該首先將其實現為Python中的一個模塊,這需要編寫相應的封裝接口,如下所示:

  1. /* wrap_mylib.c */ 
  2. #include  
  3. #include "mylib.h" 
  4. PyObject* wrap_addone(PyObject* self, PyObject* args) 
  5.  int n, result; 
  6.  if (! PyArg_ParseTuple(args, "i:fact", &n)) 
  7.  return NULL; 
  8.  result = addone(n); /*這里調用C函數 */ 
  9.  return Py_BuildValue("i", result); 
  10. static PyMethodDef mylibMethods[] = 
  11.  {"addone", wrap_addone, METH_VARARGS, "Add one to N"}, 
  12.  {NULL, NULL} 
  13. }; 
  14. void initmylib() 
  15.  PyObject* m; 
  16.  m = Py_InitModule("mylib", mylibMethods); 

上面就是一個典型的Python擴展模塊,它至少應該包含三個部分:導出函數、方法列表和初始化函數。

2 導出函數

要在Python解釋器中調用C語言中的某個函數,首先要為它編寫對應的導出函數,上述例子中的導出函數為wrap_addone。在Python的C語言擴展中,所有的導出函數都具有相同的函數原型:

  1. PyObject* wrap_method(PyObject* self, PyObject* args); 

這個函數是Python解釋器和C函數進行交互的接口,一般以wrap_開頭后面跟上C語言的函數名,這樣命名把導出函數和C語言函數對應起來使得代碼更加清晰。它帶有兩個參數:self和args。

參數self 只在C函數被實現為內聯方法(built-in method)時才被用到,通常該參數的值為空(NULL)。

參數args 中包含了Python解釋器要傳遞給C函數的所有參數,通常使用Python的C語言擴展接口提供的函數PyArg_ParseTuple()來獲得這些參數值。

所有的導出函數都返回一個PyObject指針,如果對應的C函數沒有真正的返回值(即返回值類型為void),則應返回一個全局的None對象(Py_None),并將其引用計數增1,如下所示:

  1. PyObject* wrap_method(PyObject *self, PyObject *args) 
  2.  Py_INCREF(Py_None); 
  3.  return Py_None; 

3 方法列表

方法列表中列出了所有可以被Python解釋器使用的方法,上述例子對應的方法列表為:

  1. static PyMethodDef mylibMethods[] = 
  2.  {"addone", wrap_addone, METH_VARARGS, "Add one to N"}, 
  3.  {NULL, NULL} 
  4. }; 

方法列表中的每項由四個部分組成:

方法名

導出函數

參數傳遞方式

方法描述

方法名是從Python解釋器中調用該方法時所使用的名字。

參數傳遞方式則規定了Python向C函數傳遞參數的具體形式,可選的兩種方式是METH_VARARGS和METH_KEYWORDS,其中METH_VARARGS是參數傳遞的標準形式,它通過Python的元組在Python解釋器和C函數之間傳遞參數,若采用METH_KEYWORD方式,則Python解釋器和C函數之間將通過Python的字典類型在兩者之間進行參數傳遞。

4 初始化函數

所有的Python擴展模塊都必須要有一個初始化函數,以便Python解釋器能夠對模塊進行正確的初始化。Python解釋器規定所有的初始化函數的函數名都必須以init開頭,并加上模塊的名字。對于模塊mylib來說,則相應的初始化函數為:

  1. void initmylib() 
  2.  PyObject* m; 
  3.  m = Py_InitModule("mylib", mylibMethods); 

當Python解釋器需要導入該模塊時,將根據該模塊的名稱查找相應的初始化函數,一旦找到則調用該函數進行相應的初始化工作,初始化函數則通過調用Python的C語言擴展接口所提供的函數Py_InitModule(),來向Python解釋器注冊該模塊中所有可以用到的方法。

5 編譯鏈接

要在Python解釋器中使用C語言編寫的擴展模塊,必須將其編譯成動態鏈接庫的形式。下面以Linux為例,介紹如何將C編寫的Python擴展模塊編譯成動態鏈接庫:

  1. $ gcc -fpic -shared -o mylib.so  
  2.  -I/usr/include/python2.7  
  3.  mylib.c wrap_mylib.c 

6 在Python中調用

上面編譯生成的Python擴展模塊的動態鏈接庫,可以在Python中直接import。如下所示:

  1. veelion@gtx:~$ python 
  2. Python 2.7.12 (default, Nov 19 201606:48:10
  3. [GCC 5.4.0 20160609] on linux2 
  4. Type "help""copyright""credits" or "license" for more information. 
  5. >>> import example 
  6. >>> example.addone(7
  7. 8 
  8. >>> 
  9. >>> 

這里生成的.so動態庫和上一篇中不用Python的C語言生成的動態庫是不一樣的,從生成過程和使用方法就可以看出來,這里的動態庫使用起來感覺就是一個Python模塊,直接import就可以了。

二、用boost_python庫封裝C++類

安裝boost python庫:

  1. sudo aptitude install libboost-python-dev 

示例

下面代碼簡單實現了一個普通函數maxab()和一個Student類:

  1. #include  
  2. #include  
  3. int maxab(int a, int b) { return a>b?a:b; } 
  4. class Student { 
  5.  private: 
  6.  int age; 
  7.  std::string name; 
  8.  public: 
  9.  Student() {} 
  10.  Student(std::string const& _name, int _age) { name=_name; age=_age; } 
  11.  static void myrole() { std::cout << "I'm a student!" << std::endl; } 
  12.  void whoami() { std::cout << "I am " << name << std::endl; } 
  13.  bool operator==(Student const& s) const { return age == s.age; } 
  14.  bool operator!=(Student const& s) const { return age != s.age; } 
  15. }; 

使用boost.python庫封裝也很簡單,如下代碼所示:

  1. #include  
  2. #include <boost/python.hpp> 
  3. #include <boost/python/suite/indexing/vector_indexing_suite.hpp> 
  4. #include  
  5. #include "student.h" 
  6. using namespace boost::python; 
  7. BOOST_PYTHON_MODULE(student) {  
  8.  // This will enable user-defined docstrings and python signatures, 
  9.  // while disabling the C++ signatures 
  10.  scope().attr("__version__") = "1.0.0"
  11.  scope().attr("__doc__") = "a demo module to use boost_python."
  12.  docstring_options local_docstring_options(true, false, false); 
  13.  def
  14.  "maxab", &maxab, "return max of two numbers. 
  15.  );  
  16.  class_("Student""a class of student"
  17.  .def(init<>()) 
  18.  .def(init<std::string, int>()) 
  19.  // methods for Chinese word segmentation 
  20.  .def
  21.  "whoami", &Student::whoami, "method's doc string..." 
  22.  )  
  23.  .def
  24.  "myrole", &Student::myrole, "method's doc string..." 
  25.  )  
  26.  .staticmethod("myrole"); 
  27.  // 封裝STL 
  28.  class_<std::vector >("StudentVec"
  29.  .def(vector_indexing_suite<std::vector >()) 
  30.  ;  

上述代碼還是include了Python.h文件,如果不include的話,會報錯誤:

  1. wrap_python.hpp:50:23: fatal error: pyconfig.h: No such file or directory 

編譯

編譯以上代碼有兩種方式,一種是在命令行下面直接使用g++編譯:

  1. g++ -I/usr/include/python2.7 -fPIC wrap_student.cpp -lboost_python -shared -o student.so 

首先指定Python.h的路徑,如果是Python 3的話就要修改為相應的路徑,編譯wrap_student.cpp要指定-fPIC參數,鏈接(-lboost_python)生成動態庫(-shared)。生成的student.so動態庫就可以被python直接import使用了

  1. In [1]: import student 
  2. In [2]: student.maxab(25
  3. Out[2]: 5 
  4. In [3]: s = student.Student('Tom'12
  5. In [4]: s.whoami() 
  6. I am Tom 
  7. In [5]: s.myrole() 
  8. I'm a student! 

另外一直方法是用python的setuptools編寫setup.py腳本:

  1. #!/usr/bin/env python 
  2. from setuptools import setup, Extension 
  3. setup(name="student"
  4.  ext_modules=[ 
  5.  Extension("student", ["wrap_student.cpp"],  
  6.  libraries = ["boost_python"]) 
  7. ]) 

然后執行命令編譯:

  1. python setup.py build 
  2. or 
  3. sudo python setup.py install 

三、SWIG封裝C++類

Python調用C/C++代碼的利器除了boost_python外,還有SWIG(Simplified Wrapper and Interface Generator),它是用來為腳本語言調用C和C++程序的軟件開發工具,它實際上是一個編譯器,獲取C/C++的聲明和定義,用一個殼封裝起來,以便其它腳本語言訪問這些聲明。所以,SWIG 最大的好處就是將腳本語言的開發效率和 C/C++ 的運行效率有機的結合起來。

一個雙數組Trie Tree的實現:cedar在中文分詞、新詞發現等算法中可以y用于詞典的創建。本文以cedar的SWIG封裝實現來說明SWIG的使用。

0. 安裝swig

工欲善其事必先利其器,首先要安裝swig,Ubuntu安裝swig很簡單:

  1. sudo aptitude install swig 

1. 聲明和定義C/C++代碼

在cedar的swig目錄下面有cedar的C++聲明和實現代碼trie.h,但是這個實現里面沒有遍歷所有key的函數方法,所以我添加了一個實現,首先定義一個數據結構來定義key:

  1. // key-value pair return type for next_key() 
  2. class kv_t { 
  3.  public: 
  4.  std::string key; 
  5.  int value; 
  6. }; 

添加一個函數每次返回一個key,當key字符串為空時表示遍歷結束,繼續調用的話就又從頭開始遍歷:

  1. // to iterate all keys 
  2. kv_t next_key() const { 
  3. static size_t from = 0, p = 0
  4. union { int i; int x; } b; 
  5. char key[256] = {0}; 
  6. kv_t kv; 
  7. if(from == 0) { 
  8. b.i = _t->begin(from, p); 
  9. }else
  10. b.i = _t->next(from, p); 
  11. if (b.i == trie_t::CEDAR_NO_PATH) { 
  12. kv.key = ""; 
  13. kv.value = 0
  14. from = 0
  15. p = 0
  16. return kv; 
  17. _t->suffix(key, p, from); 
  18. kv.key = key; 
  19. kv.value = b.x; 
  20. return kv; 

2. 編寫接口文件.i

查看cedar.i可以看到SWIG的接口文件的編寫規則:

首先在 %module 后面聲明模塊名稱,這就是Python在import時使用的模塊名稱;

在%{ … %}之間包含相關頭文件

在%include 后面可以聲明對STL的支持

最后聲明要封裝的函數和變量,也可以之間包含頭文件:%include “trie.h”

3. 封裝代碼

可以在Makefile里面看到python-bindings:

  1. python-bindings: 
  2.  swig -Wall -python -builtin -outdir python -c++ cedar.i 
  3.  mv -f cedar_wrap.cxx python 

直接make或者單獨運行上面的swig命令,就可以生成cedar.py和cedar_wrap.cxx文件。

4. 編譯生成動態庫

編譯生成的cedar_wrap.cxx使用python distutils的setup,可以參考python/setup.py的編寫。setup.py的build如下:

  1. python setup.py build 

就會在當前目錄下面創建目錄build,下面生成lib.linux-x86_64-2.7/cedar.py 和 _cedar.so

四、 pybind11封裝C++

從pybind11的名字可以看出,它是用來封裝C++ 11代碼為Python模塊的庫。它的目標和用法都是想Boost_python庫看齊,但是它又比龐大的Boost庫精簡。我知道這個庫的時間不長,也沒有具體實踐過。以前都是寫C++,然后用boost封裝。但是,感覺pybind11更簡潔,所以下一個項目可以試試它。到時候再分享使用心得給大家。

責任編輯:張燕妮 來源: 頭條科技
相關推薦

2021-08-18 08:00:00

Emscripten開發技術

2021-05-18 14:25:30

Linux運維Linux系統

2019-12-05 10:08:39

Python 開發編程語言

2020-05-26 13:25:00

語言編譯代碼

2025-04-02 07:40:30

2010-01-15 17:18:57

C++源程序

2010-03-26 11:00:55

Python嵌入CC++

2010-01-28 10:33:10

C++開發程序

2010-01-13 18:44:03

C++編譯

2015-04-15 09:28:45

JavaScript熱門工具

2010-03-23 10:47:46

python代碼

2010-03-26 11:00:55

Python嵌入CC++

2020-07-07 10:55:01

C++C語言代碼

2010-01-22 13:20:27

C++代碼

2010-01-20 13:29:40

C++環境

2010-01-26 15:51:06

C++變量

2010-01-21 11:23:58

C++函數調用

2009-08-14 15:07:00

C#編譯過程

2011-01-14 12:44:32

Linux PPCEclipseC

2010-01-14 11:14:47

C++應用程序
點贊
收藏

51CTO技術棧公眾號

欧美一区 二区| 91精选在线| 日韩国产在线一| 久久久91精品国产| 无码人妻丰满熟妇区毛片蜜桃精品| 免费av不卡在线观看| 久久嫩草精品久久久精品| 国产精品亚洲网站| 国产精品黄色大片| 婷婷综合五月| 亚洲欧美在线免费观看| 欧美视频亚洲图片| sis001欧美| 亚洲精品日韩一| 欧美高清一区二区| www.中文字幕| 日本不卡中文字幕| 97在线观看免费| 欧美成人777| 免费久久久久久久久| 欧美成人伊人久久综合网| 午夜dv内射一区二区| 国产在线xxx| 综合av第一页| 日韩av电影在线观看| 国产美女永久免费| 蜜桃在线一区二区三区| 91av在线影院| 国产无套内射又大又猛又粗又爽| 水蜜桃久久夜色精品一区| 亚洲精品视频网上网址在线观看 | 狠狠狠色丁香婷婷综合久久五月| 2021国产精品视频| 精品一区二区三区四| 五月开心六月丁香综合色啪| 一区二区三区动漫| 一区二区三区免费在线观看视频| 91成人入口| 在线播放日韩导航| 污视频网站观看| avav成人| 欧美体内she精视频| 国产激情在线观看视频| 在线观看特色大片免费视频| 亚洲成a人片在线观看中文| 亚洲色图都市激情| 18视频在线观看| 亚洲日本在线天堂| 一区二区三区三区在线| 欧美高清视频| 国产精品国产三级国产aⅴ原创 | 国产精品美女| 992tv在线成人免费观看| 精品无码免费视频| 91久久中文| 韩剧1988免费观看全集| 男人的天堂一区| 国产精品一国产精品k频道56| 97精品在线视频| 久久夜靖品2区| 国产麻豆综合| 国产成人精品一区二区| 国产一级精品毛片| 美女网站一区二区| 91在线视频免费| 国内精品国产成人国产三级| 国产成人超碰人人澡人人澡| 国产麻豆乱码精品一区二区三区| 97人人做人人人难人人做| 国产精品suv一区| 狂野欧美性猛交xxxx巴西| 日韩免费av片在线观看| 欧美人与禽zozo性伦| 国产无限制自拍| av岛国在线| 亚洲www啪成人一区二区麻豆| 高清欧美精品xxxxx| 日本不卡1234视频| 91黄色免费网站| 在线观看的毛片| 国产精品777777在线播放| 日韩精品在线一区二区| 成人啪啪18免费游戏链接| 福利在线一区| 亚洲性视频网站| 天海翼在线视频| 激情久久婷婷| 日韩av快播网址| 国产又黄又爽视频| k8久久久一区二区三区| 日韩亚洲欧美精品| 尤物在线网址| 欧美性猛交xxxx乱大交蜜桃| 亚洲精品一二三四五区| 成人国产精品久久| 亚洲精品www久久久久久广东| 无码人妻aⅴ一区二区三区69岛| 羞羞色午夜精品一区二区三区| 欧美激情一二区| 国产精品一区无码| 国产一区二区三区免费播放| 国产一区二区三区高清视频| 在线播放日本| 污片在线观看一区二区| 伊人影院综合在线| 理论片一区二区在线| 日韩中文字幕在线播放| 日产精品久久久久| 久久激五月天综合精品| 精品卡一卡二| 黄色在线论坛| 91官网在线观看| 无码国产精品久久一区免费| 国产中文字幕一区二区三区| 欧美激情免费观看| 在线免费观看一级片| 91丨porny丨中文| 一区二区三区四区免费观看| 都市激情亚洲一区| 亚洲第一级黄色片| 日韩欧美123区| 美女一区二区三区| 欧美一区2区三区4区公司二百| 久草在线资源站资源站| 欧美精品 国产精品| 国产又粗又猛又爽又黄av| 亚洲精品1234| 国产一区不卡在线观看| 97超碰在线公开在线看免费| 欧美丰满高潮xxxx喷水动漫| x88av在线| 久久亚洲图片| 蜜桃久久精品乱码一区二区 | 国产精品久久久久久久久免费丝袜 | 亚洲精品欧美日韩| 视频免费一区| 欧美日韩国产小视频| 国产精品久久久久久久av| 亚洲一区二区伦理| 精品国产免费久久久久久尖叫| 羞羞的视频在线看| 日韩一级视频免费观看在线| 一区二区成人免费视频| 国产在线视频精品一区| 一本一道久久a久久精品综合 | av资源新版天堂在线| 日韩免费在线观看| 麻豆成人在线视频| 国产成人精品免费视频网站| 男人天堂网站在线| 综合久久成人| 欧美韩日一区二区| 欧洲av在线播放| 香蕉成人啪国产精品视频综合网| 精品人妻伦一二三区久| 在线综合亚洲| 色一情一区二区三区四区| 日本精品网站| xxxxx成人.com| 99re只有精品| 亚洲高清免费视频| 亚洲天堂网一区二区| 久久婷婷激情| 亚洲资源视频| 亚洲国产aⅴ精品一区二区| 欧美黄色片在线观看| 人妻一区二区三区免费| 欧美性猛交xxxx乱大交3| 东方伊人免费在线观看| 国产一区欧美日韩| 免费毛片网站在线观看| 欧美人与拘性视交免费看| 国产精品国产三级国产aⅴ9色| 中文字幕在线免费| 欧美一区二区三区免费在线看| 九九热只有精品| 91免费观看视频在线| 黄色永久免费网站| 欧美激情aⅴ一区二区三区| 国模精品一区二区三区| 神马电影网我不卡| 久久综合电影一区| 婷婷色在线观看| 欧美私人免费视频| 久久久精品99| 国产日韩欧美在线一区| aaaaaaaa毛片| 新67194成人永久网站| 夜夜爽www精品| 狼人精品一区二区三区在线| 国产精品偷伦免费视频观看的| 在线视频国产区| 亚洲老头老太hd| 国内精品偷拍视频| 欧美系列亚洲系列| 久久久精品视频在线| 久久久91精品国产一区二区三区| 伊人成人222| 夜夜精品视频| 亚洲免费视频播放| 欧美男男gaytwinkfreevideos| 亚洲va欧美va在线观看| 深夜福利视频一区二区| 久热精品视频在线观看| 理论视频在线| 精品久久国产97色综合| 国产天堂第一区| 亚洲h动漫在线| 日本二区三区视频| 91蜜桃网址入口| 一本之道在线视频| 美女视频黄 久久| 黄www在线观看| 黄色综合网站| 福利网在线观看| 成人情趣视频网站| 久久久www免费人成黑人精品| 国产精品日韩精品在线播放| 日本精品久久中文字幕佐佐木| 在线观看av免费| 最新国产成人av网站网址麻豆| 五月天婷婷在线观看| 日韩美一区二区三区| 在线观看亚洲国产| 色综合久久久网| 日韩精品视频免费播放| 亚洲黄色免费网站| 免费国产羞羞网站美图| 国产精品久久午夜夜伦鲁鲁| 国产jjizz一区二区三区视频| 97精品久久久久中文字幕| av漫画在线观看| 国产成人在线色| 91蝌蚪视频在线| 久久99在线观看| 91精品无人成人www| 久热精品视频| 黄色国产小视频| 久久看片网站| 99视频精品免费| 日韩成人免费电影| 青青草精品视频在线观看| 日韩激情av在线| 五月婷婷深爱五月| 日本免费新一区视频| 日本va中文字幕| 日本不卡123| 中文字幕第17页| 狠狠色丁香九九婷婷综合五月| 欧美日韩理论片| 国产精品亚洲成人| 亚洲欧洲日韩综合| 成人动漫一区二区| 欧美xxxxx精品| 91欧美一区二区| 极品人妻videosss人妻| 国产精品少妇自拍| 69夜色精品国产69乱| 亚洲综合色视频| 99视频在线看| 在线观看欧美精品| 一级黄色片在线看| 日韩精品一区在线| 天堂在线中文资源| 国产一区二区三区18 | 久久免费高清视频| 色偷偷偷在线视频播放| 国产成人极品视频| 欧美爱爱视频| 成人午夜电影免费在线观看| 美女一区2区| 色狠狠久久av五月综合|| 国产精品久久久久蜜臀| 久草视频这里只有精品| 久久都是精品| 日本黄色福利视频| 成人午夜免费视频| 国产又粗又猛又爽视频| 中文字幕永久在线不卡| 久久免费在线观看视频| 色综合天天在线| 国产精品一区二区黑人巨大| 亚洲精品按摩视频| 免费的黄网站在线观看| 久久免费观看视频| 欧美网站免费| 国产一区免费| 欧美残忍xxxx极端| 精品少妇一区二区三区在线| 精品一区二区在线免费观看| 伊人网综合视频| 国产精品美女久久久久av爽李琼| 久久网免费视频| 在线精品观看国产| 欧美视频久久久| 深夜福利一区二区| rebdb初裸写真在线观看| 国产精品自拍网| 琪琪久久久久日韩精品| 资源网第一页久久久| 亚洲欧美清纯在线制服| 四虎国产精品免费| 国产欧美日韩激情| 久草视频在线观| 日韩欧美一级二级三级久久久| 国产精品一级伦理| 久久人人爽人人爽人人片av高请 | 精品久久久久久久久久久久久久久久久 | 日本少妇全体裸体洗澡| 欧美精品黑人性xxxx| 精品无人乱码| 午夜精品久久久99热福利| 高清国产一区二区三区四区五区| 欧美凹凸一区二区三区视频| 亚洲图片在线| 26uuu国产| 亚洲视频每日更新| 亚洲天天综合网| 亚洲欧美日韩图片| 91超碰在线| 高清av免费一区中文字幕| 91国语精品自产拍| 日本xxxx黄色| 国产视频亚洲色图| 日本一区二区免费电影| 亚洲精品suv精品一区二区| 色屁屁www国产馆在线观看| 91久久精品国产91性色| 青青草国产成人a∨下载安卓| av网址在线观看免费| 99国产精品视频免费观看| 国产一级在线免费观看| 日韩欧美国产一二三区| av在线导航| 亚洲自拍欧美色图| 欧美伊人久久| 在线观看免费看片| 一区二区三区久久| 国产999久久久| 欧美成人三级视频网站| 欧美久久亚洲| www成人免费| 成人久久18免费网站麻豆 | 人人狠狠综合久久亚洲| 久久成人激情视频| 在线亚洲一区二区| 福利片在线观看| 国产精品久久久久久久久粉嫩av| 精品国产aⅴ| 男人的天堂最新网址| 亚洲精品综合在线| 亚洲av无码乱码国产麻豆| 欧美寡妇偷汉性猛交| 久久国产精品免费精品3p| 老太脱裤子让老头玩xxxxx| 91视频xxxx| 亚洲高清在线看| 日韩在线视频网| 欧美第一在线视频| 男女啪啪免费视频网站| 91女厕偷拍女厕偷拍高清| 波多野结衣网站| 日日噜噜噜夜夜爽亚洲精品| 国产精品欧美一区二区三区不卡| 久久久国内精品| 91蜜桃在线观看| 亚洲无码精品国产| 欧美风情在线观看| 先锋影音国产精品| 杨幂毛片午夜性生毛片| 一区二区欧美在线观看| 香蕉视频免费看| 国产欧美一区二区| 亚洲图片在线| 综合 欧美 亚洲日本| 日韩一区二区免费视频| 三妻四妾完整版在线观看电视剧| 亚洲精品一区二区三区樱花| 国产一区二区在线看| 成人午夜视频精品一区| 综合网日日天干夜夜久久| 亚洲专区**| 激情五月亚洲色图| 亚洲一级二级在线| 国产精品影院在线| 成人动漫视频在线观看免费| 久久精品动漫| 美女福利视频在线观看| 亚洲美女久久久| 久久丁香四色| 日韩视频在线免费看| 一区二区三区四区精品在线视频| 日本不卡免费播放| 91夜夜揉人人捏人人添红杏| 亚洲综合日本| 高h视频免费观看| 亚洲最新中文字幕| 精品国产影院| 在线观看日本www| 精品美女久久久久久免费|