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

Python 如何有效地调试在计算密集型程序结束时调用的部分代码?,python,debugging,pycharm,Python,Debugging,Pycharm,我正在寻找在程序结束时调试代码的方法,而不必在每次调试所涉及的部分代码之前运行所有代码 也许有一点背景: 我正在使用一系列启发式方法来解决车辆路径问题。在此期间,将创建路线和车辆等复杂对象。然而,与VRP的关键一样,代码运行时间只有几分钟,在调试模式下甚至更慢(IDE是PyCharm Pro) 现在,如果我想调试将这些复杂对象作为输入的代码,我必须在每次运行调试器时运行整个代码。在达到临界点之前,需要相当长的时间。我目前正在使用的工作不是使用完整的输入数据进行调试,而是使用一个小的子样本进行调试

我正在寻找在程序结束时调试代码的方法,而不必在每次调试所涉及的部分代码之前运行所有代码

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

现在,如果我想调试将这些复杂对象作为输入的代码,我必须在每次运行调试器时运行整个代码。在达到临界点之前,需要相当长的时间。我目前正在使用的工作不是使用完整的输入数据进行调试,而是使用一个小的子样本进行调试,以减少运行时间。但是,我实际上希望对原始的完整数据进行调试

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


关于如何有效地调试这些东西,还有其他的提示和技巧吗?

如@el banto评论所述,您可能可以将复杂计算的结果pickle到磁盘文件中,然后使用它

我们还可以编写一个足够好的函数包装器,允许您在需要重新计算时删除pickle文件(干编码):


也许您可以将想要的对象pickle并保存到文本文件中。然后,只需注释掉计算密集型内容,检索pickle对象并将它们传递到程序的末尾?除了@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))