共计 2363 个字符,预计需要花费 6 分钟才能阅读完成。
原文地址
这篇笔记测试 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 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 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
三、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
四、总结
1. 在 Python 中调用 Mysql 和 直接使用 Mysql 查询,性能几乎一致,可忽略不计。
2. 大数据查询性能 Python 列表 > Pandas > Mysql
测试数据为,Mysql 查询时间 0.652s,Pandas 查询时间 0.433s,Python 列表查询时间 0.064s
看来 Python 大数据分析性能很强的~
这里想到一个问题,Pandas 基于 NumPy 开发,内部实现由 C 语言完成,理论性能应该极强,为什么测试中 Python 列表性能反而强于 Pandas?(大概强 5 倍)希望知道的朋友留言,谢谢!共同进步~