原文地址?https://www.cyberlight.xyz/passage/data-analyse-performance
這篇筆記測(cè)試Mysql、Pandas轧铁、Python列表的大數(shù)據(jù)查詢性能每聪。
手中有一張72萬(wàn)余行的數(shù)據(jù)庫(kù)表,借此機(jī)會(huì)測(cè)試三者的數(shù)據(jù)查詢性能齿风,終于解決內(nèi)心疑問(wèn)药薯。
測(cè)試環(huán)境:Ubuntu 20.04 LTS, Python 3.8.2,?Intel? Core? i7-8750H CPU @ 2.20GHz × 12
原數(shù)據(jù)有8列,724100行救斑,sql文件大小 65.5 MB
數(shù)據(jù)表第8列為時(shí)間童本,下面用三種方法分別按時(shí)間降序,記錄每種方法的用時(shí)(每種方法測(cè)試3次脸候,取平均值)
一穷娱、Mysql
1.測(cè)試性能,通過(guò)Python調(diào)用Mysql
以下為測(cè)試源碼
import pandas as pd
import mysql.connector
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) #測(cè)試Mysql查詢性能
? ? data_sql = mycursor.fetchall()
? ? mycursor.close()
? ? mydb.close()
? ? return data_sql
def main():
? ? data_sql = sql()
if __name__ == "__main__":
? ? main()
測(cè)試結(jié)果如圖
三次取平均值為 0.652s
這只是Python調(diào)用Mysql的性能运沦,這和Mysql的真實(shí)性能有不同嗎泵额?為了避免Python產(chǎn)生的誤差,接著再測(cè)試一組直接用Mysql查詢的性能携添。
2嫁盲、測(cè)試性能,直接通過(guò)Mysql查詢
輸入如下命令排序查詢
SELECT * FROM My_table ORDER BY time DESC
首次測(cè)試得到的時(shí)間如圖
測(cè)試3次的時(shí)間分別為 0.668s烈掠、0.664s羞秤、0.702s,平均值 0.678s
由此得出左敌,Python調(diào)用Mysql 和 直接使用Mysql查詢瘾蛋,性能幾乎一致,可忽略不計(jì)矫限。
二瘦黑、Pandas
以下為Pandas的測(cè)試源碼
import pandas as pd
import mysql.connector
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 eb7_today")
? ? data_sql = mycursor.fetchall()
? ? data = pd.DataFrame(data_sql, columns=['1', '2', '3', '4', '5', '6', '7', 'time'])
? ? start = datetime.datetime.now()
? ? data.sort_values('time', ascending=False, inplace = True) #按time列降序
? ? end = datetime.datetime.now()
? ? print(end - start) #測(cè)試Pandas排序時(shí)間
? ? mycursor.close()
? ? mydb.close()
? ? return data
def main():
? ? data = pa()
if __name__ == "__main__":
? ? main()
下面為測(cè)試結(jié)果
三次取平均值為 0.433s
三京革、Python列表
以下為Python列表的測(cè)試源碼
import pandas as pd
import mysql.connector
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()
? ? data_sql.sort(key=lambda x:x[7], reverse=True) #按第8列降序(time列)
? ? end = datetime.datetime.now()
? ? print(end - start) #測(cè)試Python列表的查詢性能
? ? mycursor.close()
? ? mydb.close()
? ? return data_sql
def main():
? ? data_sql = py()
if __name__ == "__main__":
? ? main()
測(cè)試結(jié)果如下
三次取平均值為 0.064s
四、總結(jié)
1.在Python中調(diào)用Mysql 和 直接使用Mysql查詢幸斥,性能幾乎一致匹摇,可忽略不計(jì)。
2.大數(shù)據(jù)查詢性能 Python列表 > Pandas > Mysql
測(cè)試數(shù)據(jù)為甲葬,Mysql查詢時(shí)間? 0.652s廊勃,Pandas查詢時(shí)間?0.433s,Python列表查詢時(shí)間?0.064s
看來(lái)Python大數(shù)據(jù)分析性能很強(qiáng)的~
這里想到一個(gè)問(wèn)題经窖,Pandas 基于?NumPy 開(kāi)發(fā)坡垫,內(nèi)部實(shí)現(xiàn)由C語(yǔ)言完成,理論性能應(yīng)該極強(qiáng)画侣,為什么測(cè)試中Python列表性能反而強(qiáng)于Pandas冰悠?(大概強(qiáng)5倍)希望知道的朋友留言,謝謝配乱!共同進(jìn)步~