如何分析 Python 数据库代码

Posted

技术标签:

【中文标题】如何分析 Python 数据库代码【英文标题】:How to Profile Python Database Code 【发布时间】:2014-08-25 23:15:18 【问题描述】:

我有一个小型 Python 项目(约 5000 行),它使用 pg 库在中型 Postgres 数据库表(约 5000 万个条目)上运行某些繁重的统计计算。

统计计算的性质意味着代码需要一段时间才能运行,我想分析我的代码的 Python 和 PSQL 方面。我尝试了我的首选 Python 分析器 (cProfile),但它似乎对 PSQL 方面视而不见。

如何在我的系统中同时分析 Python 和 PSQL?

【问题讨论】:

PSQL 端的预期输出是什么——Python 中的 PSQL 调用不会为您提供足够的信息吗? 好吧,PSQL 查询必然会涉及很多。他们不仅仅是select * from table。他们做了很多统计和数据操作。在许多情况下,我认为将查询分成更小的部分(因此可以单独分析每个组件)会使它们变慢,因为我需要创建中间表和值。我在这里可能是错的。 创建中间表和索引可能非常快(尽管肯定会受到很多变量的影响)。我不会立即放弃拆分选项——这通常会产生很大的不同。如果您不想使用临时表,CTEs(本质上是查询范围的临时表)可能会有所帮助并且使用起来更简单。您是否尝试过获取查询计划?如果生成的 SQL 过于动态,您可以让库转储将发送到服务器的 SQL,然后在 pgadminpsql 中使用它来查看查询计划。 【参考方案1】:

我只是在阅读 cProfile 文档。

它测量 CPU 时间,不计算 I/O 或进程外时间。我假设您的 SQL 查询主要由 I/O 或进程外时间控制,因此您自然不会看到它们。 (您可以通过提供自己的计时器功能使其测量挂钟时间。)

它在 cumtime 列中按功能报告包含时间,但不按代码行报告,因此您无法获得有关各行花费时间百分比的任何信息。 如果它按代码行报告挂钟时间百分比,那么您可以看到哪些查询花费最多。

Here's the technique 很多人使用。 它不担心计时的准确性。 如果某个特定查询占您等待时间的 50% 或 60% 左右,您真的关心它是哪个百分比吗?

事实上,当您只在 两个样本 上看到它时,您就知道它是一个大样本,并且您确切地知道它是什么。 p>

【讨论】:

【参考方案2】:

基本上,你不能。

可以衡量 PostgreSQL 查询中的性能和执行计划,但我什至无法想象您将如何将其与命令式编程语言的配置文件集成。你可以用 Perl 完全替换 Python,生成相同的查询,而且它不会对 PostgreSQL 产生任何盲目的影响。

所以 - 有两个有趣的问题需要回答。首先,哪些查询占用了您的所有时间?其次,查询规划器做得好吗?

首先,有许多日志文件处理器可以为您构建统计信息,但我建议您使用 pg_stat_statements 扩展名。让它继续运行,它将计算您运行不同查询的次数以及它们需要多长时间。

对于第二个,您需要检查通过EXPLAIN 生成的查询计划,看看您是否需要更改可用的索引,或者可能是查询本身。这个话题在这里太大了,但wiki 是一个很好的起点。还有一个很好的 online tool 也可以帮助说明查询计划。

【讨论】:

以上是关于如何分析 Python 数据库代码的主要内容,如果未能解决你的问题,请参考以下文章

python如何做数据分析

为什么推荐Python做数据分析?如何学习?

Twitter数据挖掘:如何使用Python分析大数据

Twitter数据挖掘:如何使用Python分析大数据

学Python数据分析看谁的书比较好

学习《Python机器学习(第2版)》中文PDF+英文PDF+代码分析+Sebastian