原文地址
這篇筆記測試Mysql、Pandas、Python列表的大數據查詢性能。python
手中有一張72萬餘行的數據庫表,藉此機會測試三者的數據查詢性能,終於解決心裏疑問。mysql
測試環境:Ubuntu 20.04 LTS, Python 3.8.2, Intel® Core™ i7-8750H CPU @ 2.20GHz × 12sql
原數據有8列,724100行,sql文件大小 65.5 MB數據庫
數據表第8列爲時間,下面用三種方法分別按時間降序,記錄每種方法的用時(每種方法測試3次,取平均值)性能
1、Mysql測試
1.測試性能,經過Python調用Mysqlfetch
如下爲測試源碼大數據
import pandas as pd import datetime def connect(): mydb = mysql.connector.connect( host="127.0.0.1", user="root", passwd="sdddddddd", database="abc" ) return mydb def sql(): mydb = connect() mycursor = mydb.cursor() start = datetime.datetime.now() mycursor.execute("SELECT * FROM My_table ORDER BY time DESC") #按time列降序 end = datetime.datetime.now() print(end - start) #測試Mysql查詢性能 data_sql = mycursor.fetchall() mycursor.close() mydb.close() return data_sql def main(): data_sql = sql() if __name__ == "__main__": main()
測試結果如圖spa
三次取平均值爲 0.652scode
這只是Python調用Mysql的性能,這和Mysql的真實性能有不一樣嗎?爲了不Python產生的偏差,接着再測試一組直接用Mysql查詢的性能。
二、測試性能,直接經過Mysql查詢
輸入以下命令排序查詢
SELECT * FROM My_table ORDER BY time DESC
首次測試獲得的時間如圖
測試3次的時間分別爲 0.668s、0.664s、0.702s,平均值 0.678s
由此得出,Python調用Mysql 和 直接使用Mysql查詢,性能幾乎一致,可忽略不計。
2、Pandas
如下爲Pandas的測試源碼
import pandas as pd import datetime def connect(): mydb = mysql.connector.connect( host="127.0.0.1", user="root", passwd="sdddddddd", database="abc" ) return mydb def pa(): mydb = connect() mycursor = mydb.cursor() mycursor.execute("SELECT * FROM My_table") data_sql = mycursor.fetchall() data = pd.DataFrame(data_sql, columns=['1', '2', '3', '4', '5', '6', '7', 'time']) start = datetime.datetime.now() data2 = data.sort_values('time', ascending=False) #按time列降序 end = datetime.datetime.now() print(end - start) #測試pandas查詢性能 mycursor.close() mydb.close() return data2 def main(): data2 = pa() if __name__ == "__main__": main()
下面爲測試結果
三次取平均值爲 0.433s
3、Python列表
如下爲Python列表的測試源碼
import pandas as pd import datetime def connect(): mydb = mysql.connector.connect( host="127.0.0.1", user="root", passwd="sdddddddd", database="abc" ) return mydb def py(): mydb = connect() mycursor = mydb.cursor() mycursor.execute("SELECT * FROM My_table") data_sql = mycursor.fetchall() start = datetime.datetime.now() data3 = data_sql.sort(key=lambda x:x[7], reverse=True) #按第8列降序(time列) end = datetime.datetime.now() print(end - start) #測試Python列表的查詢性能 mycursor.close() mydb.close() return data3 def main(): data3 = py() if __name__ == "__main__": main()
測試結果以下
三次取平均值爲 0.064s
4、總結
1.在Python中調用Mysql 和 直接使用Mysql查詢,性能幾乎一致,可忽略不計。
2.大數據查詢性能 Python列表 > Pandas > Mysql
測試數據爲,Mysql查詢時間 0.652s,Pandas查詢時間 0.433s,Python列表查詢時間 0.064s
看來Python大數據分析性能很強的~
這裏想到一個問題,Pandas 基於 NumPy 開發,內部實現由C語言完成,理論性能應該極強,爲何測試中Python列表性能反而強於Pandas?(大概強5倍)但願知道的朋友留言,謝謝!共同進步~