原文地址
这篇笔记测试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倍)但愿知道的朋友留言,谢谢!共同进步~