python - 如何有效地调试在计算密集型程序结束时调用的部分代码?

标签 python debugging pycharm

我正在寻找在程序末尾调试代码的方法,而不必在每次调试的相关代码部分之前运行所有代码。

也许有一些背景: 我正在使用一系列启发式方法来解决车辆路径问题。在此期间,创建了路线和车辆等复杂对象。然而,正如 VRP 的症结所在,代码运行时间只有几分钟,在 Debug模式下甚至更慢(IDE 是 PyCharm Pro)。

现在,如果我想调试将这些复杂对象作为输入的代码,我必须在每次运行调试器时运行整个代码。直到达到断点,需要相当长的时间。我目前使用的解决方法是不使用完整的输入数据进行调试,而仅使用一个小的子样本来减少运行时间。然而,我实际上想对原始的完整数据进行调试。

是否有某种方法可以在我想要调试的代码部分之前保存变量状态,以便每次运行调试器时都不必从头开始,而只需加载变量并从那里继续? (我只是从这个虚构的“变量恢复点”开始进行更改。)

有关如何有效调试此类内容的任何其他提示和技巧?

最佳答案

正如 @el-banto 评论的那样,您可能可以将复杂计算的结果腌制到磁盘文件上,然后使用它。

我们还可以编写一个足够好的功能包装器,如果您需要重新计算(干编码),您只需删除 pickle 文件即可:

import pickle
import os
import time


def cached_compute(filename, fn):
    if os.path.isfile(filename):
        print(f'Using cached {filename}')
        with open(filename, 'rb') as infp:
            return pickle.load(infp)
    print(f'Computing {fn}')
    res = fn()
    with open(filename, 'wb') as outfp:
        pickle.dump(res, outfp, protocol=-1)
    print('Wrote {filename}')
    return res


def expensive_computation(a, b):
    time.sleep(10)  # pretend this was expensive :)
    return a * b

# previously:
# res = expensive_computation(100, 500)

# with caching:
res = cached_compute('something.pickle', lambda: expensive_computation(100, 500))

关于python - 如何有效地调试在计算密集型程序结束时调用的部分代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59966953/

相关文章:

python - 使用更改后的 python 字典更新 SQLAlchemy orm 对象

c++ - 使用 Eclipse 调试 C++ 库

c - 当我在 GDB 中运行程序时,GDB 是如何显示程序的虚拟地址的?

python - PyCharm 无法识别 Python 文件

python - SublimeCodeIntel 和 PyQ4

python - Numpy 将整数转为小数

python - Scrapy Crawler - 如何指定要抓取的链接

python - 如何远程调试 Django 应用程序?

python - 如何卸载除pip之外的系统Python包(最佳实践)

python - 让 PyC​​harm 知道哪些类是 mixin 的