【Python性能分析】Mysql、Pandas、Python列表,三者的查詢性能誰強誰弱?

原文地址
這篇筆記測試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倍)但願知道的朋友留言,謝謝!共同進步~

相關文章
相關標籤/搜索