如何分析Python数据库代码

2 投票
2 回答
1442 浏览
提问于 2025-04-18 18:30

我有一个小的Python项目,大约有5000行代码,它会对中等大小的Postgres数据库表进行一些复杂的统计计算,这些表大约有5000万条记录,使用的是pg这个库。

因为这些统计计算的特点,代码运行起来需要一些时间,所以我想同时分析一下Python代码和PostgreSQL(PSQL)这部分的性能。我尝试使用我常用的Python性能分析工具cProfile,但它似乎无法分析PSQL的部分。

我该如何同时分析我系统中Python和PSQL的性能呢?

2 个回答

3

我刚刚在看 cProfile 的文档。

  • 它测量的是 CPU 时间,这个时间不包括输入输出(I/O)或其他进程的时间。我猜你的 SQL 查询主要是受 I/O 或其他进程的影响,所以你自然看不到它们的时间。(如果你想测量实际的时间,可以提供你自己的计时函数。)

  • cumtime 这一列中,它报告的是每个函数的总时间,但不是按代码行来算的,所以你无法知道每一行代码花了多少时间。如果它能按代码行报告实际时间的百分比,那你就能看到哪些查询耗时最多。

这是很多人使用的技巧。它不太在意计时的准确性。如果某个查询占了你等待时间的 50% 或 60%,你真的在乎具体是哪个百分比吗?

实际上,当你只看了两个样本,你就知道这个查询是个大头,而且你也知道它具体是什么。

3

基本上,你是做不到的。

你可以在PostgreSQL查询中测量性能和执行计划,但我真的无法想象你怎么把这些和一个命令式编程语言的性能分析结合起来。就算你把生成相同查询的Python换成Perl,对PostgreSQL来说也没有任何影响。

所以,有两个有趣的问题需要回答。首先,哪些查询占用了你所有的时间?其次,查询计划的执行效果好吗?

对于第一个问题,有很多日志处理工具可以为你生成统计数据,但我推荐使用pg_stat_statements这个扩展。只要让它运行,它就会统计你执行不同查询的次数和所花的时间。

对于第二个问题,你需要查看通过EXPLAIN生成的查询计划,看看是否需要调整可用的索引,或者可能需要修改查询本身。这是一个比较大的话题,但这个维基是个不错的起点。此外,还有一个很棒的在线工具可以帮助你理解查询计划。

撰写回答