python - 如何有效地调试在计算密集型程序结束时调用的部分代码?
问题描述
我正在寻找在程序结束时调试代码的方法,而不必在每次调试的相关代码部分之前运行所有代码。
也许有点背景:我正在使用一堆启发式方法来解决车辆路线问题。在此期间,会创建路线和车辆等复杂对象。然而,与 VRP 的关键一样,代码运行时间只有几分钟,在调试模式下甚至更慢(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))
推荐阅读
- node.js - Sails 节点包未更新
- python - 使用 Cython 循环?或更好的方法来删除落入给定范围内的元素
- scala - scala:单个请求中的播放框架未来执行序列
- javascript - 使用nodejs读取css样式的值
- excel - 组的第一行和最后一行的 Excel 函数
- ios - 在 CarbonTapSwipeNavigation 上应用渐变色
- html - Bootstrap 4 表单输入 - 对齐复选框
- javascript - 前端外部图像压缩
- angular - 如何循环遍历数组?
- javascript - 使用 jQuery $.getJSON() 从 Vuejs 方法中的本地 json 文件获取数据