【Python性能分析】Mysql、Pandas、Python列表,三者的查询性能谁强谁弱?

原文地址
这篇笔记测试Mysql、Pandas、Python列表的大数据查询性能。

手中有一张72万余行的数据库表,借此机会测试三者的数据查询性能,终于解决内心疑问。

测试环境:Ubuntu 20.04 LTS, Python 3.8.2, Intel® Core™ i7-8750H CPU @ 2.20GHz × 12

原数据有8列,724100行,sql文件大小 65.5 MB

数据表第8列为时间,下面用三种方法分别按时间降序,记录每种方法的用时(每种方法测试3次,取平均值)

一、Mysql

1.测试性能,通过Python调用Mysql

以下为测试源码

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) #测试Mysql查询性能
    
    data_sql = mycursor.fetchall()


    mycursor.close()
    mydb.close()
    return data_sql

def main():
    data_sql = sql()

if __name__ == "__main__":
    main()

测试结果如图

三次取平均值为 0.652s

这只是Python调用Mysql的性能,这和Mysql的真实性能有不同吗?为了避免Python产生的误差,接着再测试一组直接用Mysql查询的性能。

2、测试性能,直接通过Mysql查询

输入如下命令排序查询

SELECT * FROM My_table ORDER BY time DESC

首次测试得到的时间如图

测试3次的时间分别为 0.668s、0.664s、0.702s,平均值 0.678s

由此得出,Python调用Mysql 和 直接使用Mysql查询,性能几乎一致,可忽略不计。

二、Pandas

以下为Pandas的测试源码

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) #测试Pandas排序时间


    mycursor.close()
    mydb.close()
    return data

def main():
    data = pa()

if __name__ == "__main__":
    main()

下面为测试结果

三次取平均值为 0.433s

三、Python列表

以下为Python列表的测试源码

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) #测试Python列表的查询性能


    mycursor.close()
    mydb.close()
    return data_sql

def main():
    data_sql = py()

if __name__ == "__main__":
    main()

测试结果如下

三次取平均值为 0.064s

四、总结

1.在Python中调用Mysql 和 直接使用Mysql查询,性能几乎一致,可忽略不计。

2.大数据查询性能 Python列表 > Pandas > Mysql

测试数据为,Mysql查询时间  0.652s,Pandas查询时间 0.433s,Python列表查询时间 0.064s

看来Python大数据分析性能很强的~

这里想到一个问题,Pandas 基于 NumPy 开发,内部实现由C语言完成,理论性能应该极强,为什么测试中Python列表性能反而强于Pandas?(大概强5倍)希望知道的朋友留言,谢谢!共同进步~

10 声望
1 粉丝
0 条评论
推荐阅读
生产环境下如何优雅地使用 Docker 运行宝塔面板?
<p>此方案可能是全网最快的 宝塔面板 部署方案。 复习计算机网络时轻度折腾了 Linux、Docker、路由器 等,竟突然想到 Docker 部署宝塔面板的完美解决方案。在此使用 Python 开发并制作了宝塔面板 Docker 镜...

Cyberbolt阅读 2.9k

基于Sanic的微服务基础架构
使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力。有些异步框架Tornado、Twisted、Gevent 等就是为了解决性能问题。这些框架在性能上有些提升,但是也出现了各种古怪的问题难以...

jysong6阅读 4k评论 3

初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 1.7k评论 2

封面图
滚蛋吧,正则表达式!
你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」,首先想到的就是直接百度上搜索一个,然后采用 CV 大法神奇地接入到你的代码中?

良许4阅读 2.3k

又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。

良许5阅读 1.8k

FastAPI性能碾压Flask?
不止一次的听过,FastAPI性能碾压Flask,直追Golang,不过一直没有测试过,今天闲着没事测试一下看看结果。不知道是哪里出了问题,结果大跌眼镜。

二毛erma02阅读 10.2k评论 3

封面图
Vue+Express+Mysql全栈项目之增删改查、分页排序导出表格功能
本文记录一下实现一个全栈项目,前端使用vue框架、后端使用express框架、数据库使用mysql。此项目的意义不仅仅有助于我们复习nodejs相关知识、更有助于带前端新人,使其快速从整体全局角度中,理解常规后台管理系...

水冗水孚4阅读 2.6k

10 声望
1 粉丝
宣传栏