我如何高效地调试在计算密集型程序结尾处调用的部分代码?

问题描述 投票:1回答:1

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

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

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

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

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

python debugging pycharm
1个回答
1
投票

作为@ el-banto注释,您可能可以将复杂计算的结果腌制到磁盘文件上,然后使用它。

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

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))

© www.soinside.com 2019 - 2024. All rights reserved.