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

還在抱怨Pandas運行速度慢?這幾個方法會顛覆你的看法

大數(shù)據(jù) 數(shù)據(jù)分析
當(dāng)大家談到數(shù)據(jù)分析時,提及最多的語言就是Python和SQL。Python之所以適合數(shù)據(jù)分析,是因為它有很多第三方強大的庫來協(xié)助,pandas就是其中之一。

前言

當(dāng)大家談到數(shù)據(jù)分析時,提及最多的語言就是Python和SQL。Python之所以適合數(shù)據(jù)分析,是因為它有很多第三方強大的庫來協(xié)助,pandas就是其中之一。pandas的文檔中是這樣描述的:

  • “快速,靈活,富有表現(xiàn)力的數(shù)據(jù)結(jié)構(gòu),旨在使”關(guān)系“或”標(biāo)記“數(shù)據(jù)的使用既簡單又直觀。”

我們知道pandas的兩個主要數(shù)據(jù)結(jié)構(gòu):dataframe和series,我們對數(shù)據(jù)的一些操作都是基于這兩個數(shù)據(jù)結(jié)構(gòu)的。但在實際的使用中,我們可能很多時候會感覺運行一些數(shù)據(jù)結(jié)構(gòu)的操作會異常的慢。一個操作慢幾秒可能看不出來什么,但是一整個項目中很多個操作加起來會讓整個開發(fā)工作效率變得很低。有的朋友抱怨pandas簡直太慢了,其實對于pandas的一些操作也是有一定技巧的。

[[252533]]

pandas是基于numpy庫的數(shù)組結(jié)構(gòu)上構(gòu)建的,并且它的很多操作都是(通過numpy或者pandas自身由Cpython實現(xiàn)并編譯成C的擴展模塊)在C語言中實現(xiàn)的。因此,如果正確使用pandas的話,它的運行速度應(yīng)該是非常快的。

本篇將要介紹幾種pandas中常用到的方法,對于這些方法使用存在哪些需要注意的問題,以及如何對它們進行速度提升。

  • 將datetime數(shù)據(jù)與時間序列一起使用的優(yōu)點
  • 進行批量計算的最有效途徑
  • 通過HDFStore存儲數(shù)據(jù)節(jié)省時間

使用Datetime數(shù)據(jù)節(jié)省時間

我們來看一個例子。

  1. >>> import pandas as pd 
  2. >>> pd.__version__ 
  3. '0.23.1' 
  4.  
  5. # 導(dǎo)入數(shù)據(jù)集 
  6. >>> df = pd.read_csv('demand_profile.csv'
  7. >>> df.head() 
  8.      date_time  energy_kwh 
  9. 0  1/1/13 0:00       0.586 
  10. 1  1/1/13 1:00       0.580 
  11. 2  1/1/13 2:00       0.572 
  12. 3  1/1/13 3:00       0.596 
  13. 4  1/1/13 4:00       0.592 

從運行上面代碼得到的結(jié)果來看,好像沒有什么問題。但實際上pandas和numpy都有一個 dtypes 的概念。如果沒有特殊聲明,那么date_time將會使用一個 object的dtype類型,如下面代碼所示:

  1. >>> df.dtypes 
  2. date_time      object 
  3. energy_kwh    float64 
  4. dtype: object 
  5.  
  6. >>> type(df.iat[0, 0]) 
  7. str 

object 類型像一個大的容器,不僅僅可以承載 str,也可以包含那些不能很好地融進一個數(shù)據(jù)類型的任何特征列。而如果我們將日期作為 str 類型就會極大的影響效率。

因此,對于時間序列的數(shù)據(jù)而言,我們需要讓上面的date_time列格式化為datetime對象數(shù)組(pandas稱之為時間戳)。pandas在這里操作非常簡單,操作如下:

  1. >>> df['date_time'] = pd.to_datetime(df['date_time']) 
  2. >>> df['date_time'].dtype 
  3. datetime64[ns] 

我們來運行一下這個df看看轉(zhuǎn)化后的效果是什么樣的。

  1. >>> df.head() 
  2.                date_time    energy_kwh 
  3. 0    2013-01-01 00:00:00         0.586 
  4. 1    2013-01-01 01:00:00         0.580 
  5. 2    2013-01-01 02:00:00         0.572 
  6. 3    2013-01-01 03:00:00         0.596 
  7. 4    2013-01-01 04:00:00         0.592 

date_time的格式已經(jīng)自動轉(zhuǎn)化了,但這還沒完,在這個基礎(chǔ)上,我們還是可以繼續(xù)提高運行速度的。如何提速呢?為了更好的對比,我們首先通過 timeit 裝飾器來測試一下上面代碼的轉(zhuǎn)化時間。

  1. >>> @timeit(repeat=3, number=10) 
  2. ... def convert(df, column_name): 
  3. ...     return pd.to_datetime(df[column_name]) 
  4.  
  5. >>> df['date_time'] = convert(df, 'date_time'
  6. Best of 3 trials with 10 function calls per trial: 
  7. Function `convert` ran in average of 1.610 seconds. 

1.61s,看上去挺快,但其實可以更快,我們來看一下下面的方法。

  1. >>> @timeit(repeat=3, number=100) 
  2. >>> def convert_with_format(df, column_name): 
  3. ...     return pd.to_datetime(df[column_name], 
  4. ...                           format='%d/%m/%y %H:%M'
  5. Best of 3 trials with 100 function calls per trial: 
  6. Function `convert_with_format` ran in average of 0.032 seconds. 

結(jié)果只有0.032s,快了將近50倍。原因是:我們設(shè)置了轉(zhuǎn)化的格式format。由于在CSV中的datetimes并不是 ISO 8601 格式的,如果不進行設(shè)置的話,那么pandas將使用 dateutil 包把每個字符串str轉(zhuǎn)化成date日期。

相反,如果原始數(shù)據(jù)datetime已經(jīng)是 ISO 8601 格式了,那么pandas就可以立即使用最快速的方法來解析日期。這也就是為什么提前設(shè)置好格式format可以提升這么多。

pandas數(shù)據(jù)的循環(huán)操作

仍然基于上面的數(shù)據(jù),我們想添加一個新的特征,但這個新的特征是基于一些時間條件的,根據(jù)時長(小時)而變化,如下:

還在抱怨Pandas運行速度慢?這幾個方法會顛覆你的看法

因此,按照我們正常的做法就是使用apply方法寫一個函數(shù),函數(shù)里面寫好時間條件的邏輯代碼。

  1. def apply_tariff(kwh, hour): 
  2.     """計算每個小時的電費"""     
  3.     if 0 <= hour < 7: 
  4.         rate = 12 
  5.     elif 7 <= hour < 17: 
  6.         rate = 20 
  7.     elif 17 <= hour < 24: 
  8.         rate = 28 
  9.     else
  10.         raise ValueError(f'Invalid hour: {hour}'
  11.     return rate * kwh 

然后使用for循環(huán)來遍歷df,根據(jù)apply函數(shù)邏輯添加新的特征,如下:

  1. >>> # 不贊同這種操作 
  2. >>> @timeit(repeat=3, number=100) 
  3. ... def apply_tariff_loop(df): 
  4. ...     """Calculate costs in loop.  Modifies `df` inplace.""" 
  5. ...     energy_cost_list = [] 
  6. ...     for i in range(len(df)): 
  7. ...         # 獲取用電量和時間(小時) 
  8. ...         energy_used = df.iloc[i]['energy_kwh'
  9. ...         hour = df.iloc[i]['date_time'].hour 
  10. ...         energy_cost = apply_tariff(energy_used, hour
  11. ...         energy_cost_list.append(energy_cost) 
  12. ...     df['cost_cents'] = energy_cost_list 
  13. ...  
  14. >>> apply_tariff_loop(df) 
  15. Best of 3 trials with 100 function calls per trial: 
  16. Function `apply_tariff_loop` ran in average of 3.152 seconds. 

對于那些寫Pythonic風(fēng)格的人來說,這個設(shè)計看起來很自然。然而,這個循環(huán)將會嚴重影響效率,也是不贊同這么做。原因有幾個:

  • 首先,它需要初始化一個將記錄輸出的列表。
  • 其次,它使用不透明對象范圍(0,len(df))循環(huán),然后在應(yīng)用apply_tariff()之后,它必須將結(jié)果附加到用于創(chuàng)建新DataFrame列的列表中。它還使用df.iloc [i] ['date_time']執(zhí)行所謂的鏈?zhǔn)剿饕@通常會導(dǎo)致意外的結(jié)果。
  • 但這種方法的***問題是計算的時間成本。對于8760行數(shù)據(jù),此循環(huán)花費了3秒鐘。接下來,你將看到一些改進的Pandas結(jié)構(gòu)迭代解決方案。

使用itertuples() 和iterrows() 循環(huán)

那么推薦做法是什么樣的呢?

實際上可以通過pandas引入itertuples和iterrows方法可以使效率更快。這些都是一次產(chǎn)生一行的生成器方法,類似scrapy中使用的yield用法。

.itertuples為每一行產(chǎn)生一個namedtuple,并且行的索引值作為元組的***個元素。nametuple是Python的collections模塊中的一種數(shù)據(jù)結(jié)構(gòu),其行為類似于Python元組,但具有可通過屬性查找訪問的字段。

.iterrows為DataFrame中的每一行產(chǎn)生(index,series)這樣的元組。

雖然.itertuples往往會更快一些,但是在這個例子中使用.iterrows,我們看看這使用iterrows后效果如何。

  1. >>> @timeit(repeat=3, number=100) 
  2. ... def apply_tariff_iterrows(df): 
  3. ...     energy_cost_list = [] 
  4. ...     for index, row in df.iterrows(): 
  5. ...         # 獲取用電量和時間(小時) 
  6. ...         energy_used = row['energy_kwh'
  7. ...         hour = row['date_time'].hour 
  8. ...         # 添加cost列表 
  9. ...         energy_cost = apply_tariff(energy_used, hour
  10. ...         energy_cost_list.append(energy_cost) 
  11. ...     df['cost_cents'] = energy_cost_list 
  12. ... 
  13. >>> apply_tariff_iterrows(df) 
  14. Best of 3 trials with 100 function calls per trial: 
  15. Function `apply_tariff_iterrows` ran in average of 0.713 seconds. 

語法方面:這樣的語法更明確,并且行值引用中的混亂更少,因此它更具可讀性。

在時間收益方面:快了近5倍! 但是,還有更多的改進空間。我們?nèi)匀辉谑褂媚撤N形式的Python for循環(huán),這意味著每個函數(shù)調(diào)用都是在Python中完成的,理想情況是它可以用Pandas內(nèi)部架構(gòu)中內(nèi)置的更快的語言完成。

Pandas的 .apply()方法

我們可以使用.apply方法而不是.iterrows進一步改進此操作。Pandas的.apply方法接受函數(shù)(callables)并沿DataFrame的軸(所有行或所有列)應(yīng)用它們。在此示例中,lambda函數(shù)將幫助你將兩列數(shù)據(jù)傳遞給apply_tariff():

  1. >>> @timeit(repeat=3, number=100) 
  2. ... def apply_tariff_withapply(df): 
  3. ...     df['cost_cents'] = df.apply( 
  4. ...         lambda row: apply_tariff( 
  5. ...             kwh=row['energy_kwh'], 
  6. ...             hour=row['date_time'].hour), 
  7. ...         axis=1) 
  8. ... 
  9. >>> apply_tariff_withapply(df) 
  10. Best of 3 trials with 100 function calls per trial: 
  11. Function `apply_tariff_withapply` ran in average of 0.272 seconds. 

.apply的語法優(yōu)點很明顯,行數(shù)少,代碼可讀性高。在這種情況下,所花費的時間大約是.iterrows方法的一半。

但是,這還不是“非常快”。一個原因是.apply()將在內(nèi)部嘗試循環(huán)遍歷Cython迭代器。但是在這種情況下,傳遞的lambda不是可以在Cython中處理的東西,因此它在Python中調(diào)用,因此并不是那么快。

如果你使用.apply()獲取10年的小時數(shù)據(jù),那么你將需要大約15分鐘的處理時間。如果這個計算只是大型模型的一小部分,那么你真的應(yīng)該加快速度。這也就是矢量化操作派上用場的地方。

矢量化操作:使用.isin()選擇數(shù)據(jù)

什么是矢量化操作?如果你不基于一些條件,而是可以在一行代碼中將所有電力消耗數(shù)據(jù)應(yīng)用于該價格(df ['energy_kwh'] * 28),類似這種。這個特定的操作就是矢量化操作的一個例子,它是在Pandas中執(zhí)行的最快方法。

但是如何將條件計算應(yīng)用為Pandas中的矢量化運算?一個技巧是根據(jù)你的條件選擇和分組DataFrame,然后對每個選定的組應(yīng)用矢量化操作。 在下一個示例中,你將看到如何使用Pandas的.isin()方法選擇行,然后在向量化操作中實現(xiàn)上面新特征的添加。在執(zhí)行此操作之前,如果將date_time列設(shè)置為DataFrame的索引,則會使事情更方便:

  1. df.set_index('date_time', inplace=True
  2.  
  3. @timeit(repeat=3, number=100) 
  4. def apply_tariff_isin(df): 
  5.     # 定義小時范圍Boolean數(shù)組 
  6.     peak_hours = df.index.hour.isin(range(17, 24)) 
  7.     shoulder_hours = df.index.hour.isin(range(7, 17)) 
  8.     off_peak_hours = df.index.hour.isin(range(0, 7)) 
  9.  
  10.     # 使用上面的定義 
  11.     df.loc[peak_hours, 'cost_cents'] = df.loc[peak_hours, 'energy_kwh'] * 28 
  12.     df.loc[shoulder_hours,'cost_cents'] = df.loc[shoulder_hours, 'energy_kwh'] * 20 
  13.     df.loc[off_peak_hours,'cost_cents'] = df.loc[off_peak_hours, 'energy_kwh'] * 12 

我們來看一下結(jié)果如何。

  1. >>> apply_tariff_isin(df) 
  2. Best of 3 trials with 100 function calls per trial: 
  3. Function `apply_tariff_isin` ran in average of 0.010 seconds. 

為了了解剛才代碼中發(fā)生的情況,我們需要知道.isin()方法返回的是一個布爾值數(shù)組,如下所示:

  1. [FalseFalseFalse, ..., TrueTrueTrue

這些值標(biāo)識哪些DataFrame索引(datetimes)落在指定的小時范圍內(nèi)。然后,當(dāng)你將這些布爾數(shù)組傳遞給DataFrame的.loc索引器時,你將獲得一個僅包含與這些小時匹配的行的DataFrame切片。在那之后,僅僅是將切片乘以適當(dāng)?shù)馁M率,這是一種快速的矢量化操作。

這與我們上面的循環(huán)操作相比如何?首先,你可能會注意到不再需要apply_tariff(),因為所有條件邏輯都應(yīng)用于行的選擇。因此,你必須編寫的代碼行和調(diào)用的Python代碼會大大減少。

處理時間怎么樣?比不是Pythonic的循環(huán)快315倍,比.iterrows快71倍,比.apply快27倍。

還可以做的更好嗎?

在apply_tariff_isin中,我們?nèi)匀豢梢酝ㄟ^調(diào)用df.loc和df.index.hour.isin三次來進行一些“手動工作”。如果我們有更精細的時隙范圍,你可能會爭辯說這個解決方案是不可擴展的。幸運的是,在這種情況下,你可以使用Pandas的pd.cut() 函數(shù)以編程方式執(zhí)行更多操作:

  1. @timeit(repeat=3, number=100) 
  2. def apply_tariff_cut(df): 
  3.     cents_per_kwh = pd.cut(x=df.index.hour
  4.                            bins=[0, 7, 17, 24], 
  5.                            include_lowest=True
  6.                            labels=[12, 20, 28]).astype(int
  7.     df['cost_cents'] = cents_per_kwh * df['energy_kwh'

讓我們看看這里發(fā)生了什么。pd.cut() 根據(jù)每小時所屬的bin應(yīng)用一組標(biāo)簽(costs)。

  • 注意include_lowest參數(shù)表示***個間隔是否應(yīng)該是包含左邊的(您希望在組中包含時間= 0)。

這是一種完全矢量化的方式來獲得我們的預(yù)期結(jié)果,它在時間方面是最快的:

  1. >>> apply_tariff_cut(df) 
  2. Best of 3 trials with 100 function calls per trial: 
  3. Function `apply_tariff_cut` ran in average of 0.003 seconds. 

到目前為止,時間上基本快達到極限了,只需要花費不到一秒的時間來處理完整的10年的小時數(shù)據(jù)集。但是,***一個選項是使用 NumPy 函數(shù)來操作每個DataFrame的底層NumPy數(shù)組,然后將結(jié)果集成回Pandas數(shù)據(jù)結(jié)構(gòu)中。

使用Numpy繼續(xù)加速

使用Pandas時不應(yīng)忘記的一點是Pandas Series和DataFrames是在NumPy庫之上設(shè)計的。這為你提供了更多的計算靈活性,因為Pandas可以與NumPy陣列和操作無縫銜接。

下面,我們將使用NumPy的 digitize() 函數(shù)。它類似于Pandas的cut(),因為數(shù)據(jù)將被分箱,但這次它將由一個索引數(shù)組表示,這些索引表示每小時所屬的bin。然后將這些索引應(yīng)用于價格數(shù)組:

  1. @timeit(repeat=3, number=100) 
  2. def apply_tariff_digitize(df): 
  3.     prices = np.array([12, 20, 28]) 
  4.     bins = np.digitize(df.index.hour.values, bins=[7, 17, 24]) 
  5.     df['cost_cents'] = prices[bins] * df['energy_kwh'].values 

與cut函數(shù)一樣,這種語法非常簡潔易讀。但它在速度方面有何比較?讓我們來看看:

  1. >>> apply_tariff_digitize(df) 
  2. Best of 3 trials with 100 function calls per trial: 
  3. Function `apply_tariff_digitize` ran in average of 0.002 seconds. 

在這一點上,仍然有性能提升,但它本質(zhì)上變得更加邊緣化。使用Pandas,它可以幫助維持“層次結(jié)構(gòu)”,如果你愿意,可以像在此處一樣進行批量計算,這些通常排名從最快到最慢(最靈活到最不靈活):

  1. 使用向量化操作:沒有for循環(huán)的Pandas方法和函數(shù)。
  2. 將.apply方法:與可調(diào)用方法一起使用。
  3. 使用.itertuples:從Python的集合模塊迭代DataFrame行作為namedTuples。
  4. 使用.iterrows:迭代DataFrame行作為(index,Series)對。雖然Pandas系列是一種靈活的數(shù)據(jù)結(jié)構(gòu),但將每一行構(gòu)建到一個系列中然后訪問它可能會很昂貴。
  5. 使用“element-by-element”循環(huán):使用df.loc或df.iloc一次更新一個單元格或行。

還在抱怨Pandas運行速度慢?這幾個方法會顛覆你的看法

使用HDFStore防止重新處理

現(xiàn)在你已經(jīng)了解了Pandas中的加速數(shù)據(jù)流程,接著讓我們探討如何避免與最近集成到Pandas中的HDFStore一起重新處理時間。

通常,在構(gòu)建復(fù)雜數(shù)據(jù)模型時,可以方便地對數(shù)據(jù)進行一些預(yù)處理。例如,如果您有10年的分鐘頻率耗電量數(shù)據(jù),即使你指定格式參數(shù),只需將日期和時間轉(zhuǎn)換為日期時間可能需要20分鐘。你真的只想做一次,而不是每次運行你的模型,進行測試或分析。

你可以在此處執(zhí)行的一項非常有用的操作是預(yù)處理,然后將數(shù)據(jù)存儲在已處理的表單中,以便在需要時使用。但是,如何以正確的格式存儲數(shù)據(jù)而無需再次重新處理?如果你要另存為CSV,則只會丟失datetimes對象,并且在再次訪問時必須重新處理它。

Pandas有一個內(nèi)置的解決方案,它使用 HDF5,這是一種專門用于存儲表格數(shù)據(jù)陣列的高性能存儲格式。 Pandas的 HDFStore 類允許你將DataFrame存儲在HDF5文件中,以便可以有效地訪問它,同時仍保留列類型和其他元數(shù)據(jù)。它是一個類似字典的類,因此您可以像讀取Python dict對象一樣進行讀寫。

以下是將預(yù)處理電力消耗DataFrame df存儲在HDF5文件中的方法:

  1. # 創(chuàng)建儲存對象,并存為 processed_data 
  2. data_store = pd.HDFStore('processed_data.h5'
  3.  
  4. # 將 DataFrame 放進對象中,并設(shè)置 key 為 preprocessed_df 
  5. data_store['preprocessed_df'] = df 
  6. data_store.close() 

現(xiàn)在,你可以關(guān)閉計算機并休息一下。等你回來的時候,你處理的數(shù)據(jù)將在你需要時為你所用,而無需再次加工。以下是如何從HDF5文件訪問數(shù)據(jù),并保留數(shù)據(jù)類型:

  1. # 獲取數(shù)據(jù)儲存對象 
  2. data_store = pd.HDFStore('processed_data.h5'
  3.  
  4. # 通過key獲取數(shù)據(jù) 
  5. preprocessed_df = data_store['preprocessed_df'
  6. data_store.close() 

數(shù)據(jù)存儲可以容納多個表,每個表的名稱作為鍵。

關(guān)于在Pandas中使用HDFStore的注意事項:您需要安裝PyTables> = 3.0.0,因此在安裝Pandas之后,請確保更新PyTables,如下所示:

  1. pip install --upgrade tables 

結(jié)論

如果你覺得你的Pandas項目不夠快速,靈活,簡單和直觀,請考慮重新考慮你使用該庫的方式。

這里探討的示例相當(dāng)簡單,但說明了Pandas功能的正確應(yīng)用如何能夠大大改進運行時和速度的代碼可讀性。以下是一些經(jīng)驗,可以在下次使用Pandas中的大型數(shù)據(jù)集時應(yīng)用這些經(jīng)驗法則:

  • 嘗試盡可能使用矢量化操作,而不是在df 中解決for x的問題。如果你的代碼是許多for循環(huán),那么它可能更適合使用本機Python數(shù)據(jù)結(jié)構(gòu),因為Pandas會帶來很多開銷。
  • 如果你有更復(fù)雜的操作,其中矢量化根本不可能或太難以有效地解決,請使用.apply方法。
  • 如果必須循環(huán)遍歷數(shù)組(確實發(fā)生了這種情況),請使用.iterrows()或.itertuples()來提高速度和語法。
  • Pandas有很多可選性,幾乎總有幾種方法可以從A到B。請注意這一點,比較不同方法的執(zhí)行方式,并選擇在項目環(huán)境中效果***的路線。
  • 一旦建立了數(shù)據(jù)清理腳本,就可以通過使用HDFStore存儲中間結(jié)果來避免重新處理。
  • 將NumPy集成到Pandas操作中通常可以提高速度并簡化語法。
責(zé)任編輯:未麗燕 來源: xiaoyu
相關(guān)推薦

2013-10-17 15:30:04

方法調(diào)用object

2018-08-02 16:17:34

Python 開發(fā)編程語言

2020-09-18 06:48:21

Python編程語言

2010-04-12 10:01:43

Windows 7運行速度

2021-05-31 07:37:48

Windows10操作系統(tǒng)微軟

2011-03-08 13:52:25

Proftpd

2011-04-02 16:45:58

SQL Server查詢優(yōu)化

2010-05-21 18:01:13

2011-04-02 16:39:53

SQL Server查詢

2024-06-04 16:59:54

2011-09-07 14:55:47

ubuntudns

2012-05-24 09:53:01

Wi-Fi速度Wi-Fi

2010-05-24 08:54:10

2021-11-03 06:28:21

Python運行速度開發(fā)

2010-06-18 12:37:04

SQL Server查

2010-07-09 09:08:43

2009-08-11 09:10:26

Windows 7系統(tǒng)提速

2010-07-09 08:46:34

SQL Server查

2010-06-29 10:39:48

SQL Server查

2010-06-29 09:56:00

SQL Server查
點贊
收藏

51CTO技術(shù)棧公眾號

男女污视频在线观看| 久一视频在线观看| 中文字幕欧美在线观看| 日韩精品一区二区久久| 欧美挠脚心视频网站| 成人免费在线看片| 国产欧美日韩另类| 国产一区二区三区电影在线观看| 91超碰这里只有精品国产| 在线观看av的网址| 你懂得在线网址| 韩国视频一区二区| 欧美性视频精品| 亚洲少妇xxx| 久久91在线| 欧美日本不卡视频| 奇米影视亚洲色图| 国产ts人妖调教重口男| 国产亚洲精品美女久久久久久久久久| 欧美精品色一区二区三区| 日韩视频在线视频| 在线观看黄av| 国产91丝袜在线播放九色| 最近2019中文免费高清视频观看www99| 久久综合桃花网| 欧美电影网站| 亚洲福利视频一区| 在线播放 亚洲| 美州a亚洲一视本频v色道| 国产成人在线视频网址| 国产精品一区二区三区成人| www成人在线| 韩国在线视频一区| 日韩一区二区在线视频| 亚洲18在线看污www麻豆| 免费成人在线电影| 亚洲最大色网站| 一区二区不卡在线视频 午夜欧美不卡'| 五十路在线视频| 成人性视频免费网站| 成人福利在线观看| 怡红院男人天堂| 中日韩免视频上线全都免费| 欧美一级艳片视频免费观看| 亚洲 激情 在线| 免费日韩电影| 欧美午夜丰满在线18影院| 极品粉嫩国产18尤物| 91蜜桃在线视频| 国产精品久久久久久久久免费相片| 国产精品久久久久免费a∨| 日韩精品――中文字幕| 国产精品va| 欧美日韩成人在线视频| 日本在线一级片| 综合五月婷婷| 色综合久久88色综合天天看泰| 2025国产精品自拍| 欧美黄色免费| 亚洲精品www| 中文字幕永久免费| 欧美电影院免费观看| 91精品国产美女浴室洗澡无遮挡| 一区二区三区欧美精品| 国产一区二区三区国产精品| 欧美一级片在线| 亚洲天堂小视频| 国色天香久久精品国产一区| 91精品久久久久久蜜臀| 韩国三级丰满少妇高潮| 天堂va在线高清一区| 精品乱人伦一区二区三区| 极品白嫩的小少妇| 色婷婷久久久| 在线亚洲午夜片av大片| 国产中文字幕久久| 中文字幕乱码亚洲无线精品一区 | 欧美中文在线观看国产| av网站中文字幕| 日本成人超碰在线观看| 国产美女久久精品| 99精品人妻无码专区在线视频区| 国产99久久久国产精品| 久久人人爽爽人人爽人人片av| 日本大片在线观看| 中文字幕av一区二区三区高 | 男生草女生视频| 欧美中文字幕一区二区| 久久久97精品| 日韩精品视频免费播放| 久久亚洲美女| 91精品视频播放| 熟妇高潮一区二区高潮| 国产色产综合色产在线视频| 国产又爽又黄ai换脸| 激情av在线| 欧美性xxxx| 污污的视频免费观看| 精品国产一区二区三区成人影院| 亚洲少妇中文在线| 国产黄色的视频| 亚洲欧美日韩精品一区二区 | av天堂永久资源网| 国产精品.xx视频.xxtv| 亚洲第一偷拍网| 国产三级短视频| 日韩视频一区| 成人a在线视频| 手机亚洲第一页| 国模大尺度一区二区三区| 国产传媒欧美日韩| 成年人视频在线观看免费| 亚洲自拍与偷拍| 黄色免费网址大全| 国产精品极品| 久久精品亚洲一区| 国产熟妇一区二区三区四区| 国产黄色精品视频| 视频一区二区在线观看| 国产盗摄精品一区二区酒店| 欧美伦理视频网站| 女~淫辱の触手3d动漫| 狠狠爱www人成狠狠爱综合网 | 午夜视频网站在线观看| 一本色道久久综合| 成人福利网站在线观看| 国产亚洲依依| 欧美日韩免费看| 霍思燕三级露全乳照| 亚洲欧美在线综合| 亚洲区一区二区| 日韩字幕在线观看| 国产另类ts人妖一区二区| 亚洲成人18| 美女100%一区| 日韩国产欧美区| 久久久精品国产sm调教网站| 韩国av一区二区三区| 性欧美videosex高清少妇| 伊人久久视频| 亚洲精品suv精品一区二区| 国产在线视频在线观看| 国产成人在线看| 日韩不卡一二区| 深夜福利亚洲| www.xxxx欧美| ,亚洲人成毛片在线播放| 国产目拍亚洲精品99久久精品| 四虎永久在线精品无码视频| 色婷婷狠狠五月综合天色拍| 国产91精品视频在线观看| 亚洲欧洲精品视频| 精品久久中文字幕久久av| 亚洲男人在线天堂| 国产最新精品| 国产精品成人免费电影| 久久天堂电影| 在线免费观看日本欧美| 国产精品jizz| 视频一区中文字幕| 亚洲高清精品中出| 国语自产精品视频在线看抢先版结局| 一区二区欧美日韩视频| 这里只有精品国产| 国产精品二区一区二区aⅴ污介绍| 少妇一级淫免费放| 91日韩在线| 91入口在线观看| 蜜芽tv福利在线视频| 色哟哟在线观看一区二区三区| 日韩在线免费观看av| 免费观看成人av| 国产午夜精品在线| 一级毛片视频在线| 884aa四虎影成人精品一区| 欧美一级片在线视频| 国产一区不卡视频| 国产不卡一区二区视频| 欧美人与物videos另类xxxxx| 国产精品久久久久免费a∨大胸 | 99热精品在线播放| 亚洲一区二区三区三| www国产视频| 天堂蜜桃一区二区三区| 正义之心1992免费观看全集完整版| 青草av在线| 亚洲精品久久久久久久久久久 | 久久福利毛片| aa成人免费视频| 九色porny丨首页入口在线| 亚洲区免费影片| 99久久精品国产一区色| 性做久久久久久久免费看| 无码国产69精品久久久久同性| 精品一区二区三区久久| 久久精品国产一区二区三区日韩| 欧美人体一区二区三区| 久久久www成人免费精品张筱雨| 黑人乱码一区二区三区av| 色悠悠久久综合| 九九视频在线观看| 国产日韩在线不卡| 美女扒开腿免费视频| 亚洲国产一区二区在线观看| 精品国产乱码久久久久久108| 97欧美成人| 欧美精品xxx| av免费观看一区二区| 精品久久免费看| 亚洲在线观看av| 欧美日韩亚洲视频| 亚洲国产123| 久久精品一区二区| 九九九九九国产| 老司机免费视频久久| av 日韩 人妻 黑人 综合 无码| 国产999精品在线观看| 欧美有码在线观看| 欧美色图天堂| 久久精品小视频| 可以直接在线观看的av| 精品国产91久久久久久久妲己| 中文字幕在线观看高清| 色诱视频网站一区| 日韩久久久久久久久| 一区二区三区成人在线视频| 黄色一级片一级片| 精品一区二区三区在线观看国产| 欧美啪啪免费视频| 欧美69wwwcom| 亚洲一区二区免费视频软件合集 | 欧美日韩免费做爰视频| 亚洲国产高清不卡| 成人国产精品久久久网站| av电影一区二区| 丰满少妇xbxb毛片日本| 国产精品99久| 在线成人免费av| 久久99国产乱子伦精品免费| 国产视频手机在线播放| 久久一综合视频| 国产裸体舞一区二区三区| 国产视频一区欧美| 欧美日韩在线精品| 牛牛精品成人免费视频| 国产黑人绿帽在线第一区| 国产无遮挡裸体视频在线观看| 欧美高清在线视频观看不卡| 四虎影视国产在线视频| 日韩电影在线观看永久视频免费网站| 亚洲黄色一级大片| 日韩精品一区二区三区老鸭窝| 国产精品久久久久久久一区二区| 欧美三区在线观看| 中文字幕在线播放日韩| 欧美男女性生活在线直播观看| 97精品人妻一区二区三区| 51精品国自产在线| 国产夫妻性生活视频| 日韩一二在线观看| 国模私拍视频在线| 亚洲国产精品999| 美女毛片在线看| 亚洲香蕉av在线一区二区三区| 国产三级视频在线播放线观看| 一本色道久久综合狠狠躁篇的优点| 国产在线观看网站| 日韩亚洲一区二区| 亚洲丝袜一区| 性欧美xxxx交| 九七电影韩国女主播在线观看| 日韩中文字幕在线播放| 国产日产一区二区三区| 久久6免费高清热精品| jizz一区二区三区| 奇米4444一区二区三区| 国产成人午夜性a一级毛片| 成人在线激情视频| 97久久综合区小说区图片区| 久久99精品久久久久久青青日本| 精品久久久久久久久久久aⅴ| 一本久道久久综合| 精品成人久久| 日本精品福利视频| 亚洲久久在线| 老司机午夜av| 国产成人精品影院| 国精品无码人妻一区二区三区| 中文一区二区在线观看| 麻豆视频在线观看| 一本到不卡免费一区二区| 国产尤物在线观看| 亚洲国产福利在线| 尤物网址在线观看| 亚洲18私人小影院| 日韩免费大片| 久久视频在线观看中文字幕| 国产韩国精品一区二区三区| 欧美 日韩 国产 高清| 久草在线在线精品观看| 最近2019中文字幕第三页视频| 高清国产福利在线观看| 久精品免费视频| 精品视频一区二区三区四区五区| 欧美极品第一页| 日韩在线免费| 国产精品乱码一区二区三区| 成人三级视频| 国产视频一视频二| 国产在线一区观看| 永久免费看mv网站入口78| 樱桃视频在线观看一区| 天堂网一区二区| 亚洲国产精品va在看黑人| 韩国av网站在线| 国产精品狼人色视频一区| 欧美三级午夜理伦三级小说| 加勒比海盗1在线观看免费国语版| 日韩二区三区在线观看| 亚洲精品女人久久久| 一区二区三区精品| 国产又粗又长又大视频| 国产亚洲免费的视频看| 嗯啊主人调教在线播放视频 | 国产女主播在线一区二区| 国产亚洲精品码| 欧美一区二区在线免费观看| 成人高清在线| 国产ts一区二区| 日韩丝袜视频| 久久久久久久久久久99| 国产+成+人+亚洲欧洲自线| 欧美另类videoxo高潮| 欧美在线观看你懂的| 国产真人无遮挡作爱免费视频| 亚洲第一级黄色片| 中文字幕免费高清电视剧网站在线观看 | 国产一区在线免费观看| 国内精品久久久久久久97牛牛 | 国产亚洲一级高清| 韩国美女久久| 欧美日韩在线播放一区二区| 99国产精品99久久久久久粉嫩| 蜜臀av粉嫩av懂色av| 亚洲一区二区三区四区中文字幕| aaa国产视频| 九九热这里只有在线精品视| 精品一区二区三区视频在线播放| 天天综合中文字幕| 久久99精品国产麻豆婷婷洗澡| 美国一级黄色录像| 欧美日韩国产一级片| 免费在线午夜视频| 亚洲va欧美va国产综合剧情| 一区二区蜜桃| 亚洲成人精品在线播放| 亚洲国产日韩a在线播放性色| 亚洲免费一级片| 97色在线播放视频| 在线视频亚洲专区| 国产精品拍拍拍| 中文字幕亚洲一区二区av在线 | 亚洲精品wwww| 欧美91看片特黄aaaa| 日韩妆和欧美的一区二区| 欧美aaa在线| tube国产麻豆| 亚洲国产精品成人av| 日本久久免费| 资源网第一页久久久| 国产成人在线影院| 啦啦啦免费高清视频在线观看| 亚洲天堂开心观看| 高清一区二区| 精品无码国模私拍视频| 国产三级欧美三级日产三级99 | 亚洲午夜久久久影院伊人| 激情小说亚洲一区| 久久丫精品久久丫| 亚洲欧洲xxxx| 免费看日产一区二区三区 | 三妻四妾的电影电视剧在线观看| 欧美色图亚洲自拍| 国产一区二区三区免费播放| 国产午夜激情视频| 国产一区二区三区在线免费观看| 国产精品亚洲四区在线观看 | 免费人成在线不卡| 欧美日韩人妻精品一区二区三区| 精品国产一区二区国模嫣然| 玛雅亚洲电影| 国产黄色激情视频| 久久看人人爽人人| 国产乱码精品一区二区三区精东| 午夜精品久久久久久99热软件| 大片网站久久| 香港三级日本三级| 7777精品伊人久久久大香线蕉超级流畅| caoporn视频在线| 资源网第一页久久久|