如何理解我的代码的哪一部分花费的时间最多?

Posted

技术标签:

【中文标题】如何理解我的代码的哪一部分花费的时间最多?【英文标题】:How to understand which part of my code is taking the most time? 【发布时间】:2021-12-01 09:34:50 【问题描述】:

我已经在 Python 中实现了一个使用蒙特卡罗模拟的代码,但即使在 N=1000 时也需要太多时间。我有两个问题:

    现在我在 Notebook 上运行它,在我的电脑上的 Pycharm 上运行它会提高性能吗?

    如何了解我的代码的哪一部分花费的时间最多?例如,我想知道:您的代码在这个 for 循环中花费了 x% 的时间,在另一个 for 循环中花费了 y%。

编辑:

代码尤其是用于评估扑克牌的赔率,所以我模拟了很多棋盘,并且每次都评估哪一手牌更好。

【问题讨论】:

您可以添加您的代码吗?我倾向于使用时间模块,并在我的代码中的不同位置调用 t1 = time.time() 来计算每个位需要多长时间。我也相信有一个 timeit 模块也可以用来计时 您是否尝试过为您希望花费更多时间的特定代码位置计时? 试试profilehooks 我们真的无法回答第一个问题——您的笔记本运行在 some 计算机上,而您的 PyCharm 运行在 some 计算机上。在不知道任何一个的情况下,我们不能说哪个更快,或者它们是否甚至不同。许多 Monte Carlos 模拟不应由 Notebook 或 Pycharm 运行,而应由裸 Python 可执行文件运行,甚至可能通过批处理系统或类似系统运行。 至于第二个:你描述的叫profiling。有很多选择。 【参考方案1】:

在 Python 的标准库中有一对用于分析代码的模块 - 请参阅 How can you profile a Python script?

还有许多可用的第三方模块可以为您提供更细粒度的代码执行视图 — 请参阅 How do I use line_profiler (from Robert Kern)?

我自己没有尝试过,但profilehooks 看起来也很有前途且易于使用。

【讨论】:

以上是关于如何理解我的代码的哪一部分花费的时间最多?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试我的React Recipe Box代码?

Google Cloud Profiling 如何通过分析优化我的代码?

Xcode 理解如何分析调用栈

评估我的 php 代码

如何在基于 SpringBoot 构建的 Java REST API 中查找源代码的哪一部分执行时间更长?

如何对给定的代码应用阿姆达尔定律?