我有一个计算速度慢的程序,我希望调试算法.现在总是重新运行所有内容非常繁琐,我宁愿从程序中间重新启动.你能想到一些聪明的方法来实现这个目标吗?
第一个模糊的想法是定义检查点(我在其中进行函数调用),其中我用pickle和/或sqlite保存本地和大数据(sqlite能够检查中间数据).后来我可以尝试调用程序告诉它在特定检查点重新启动.但是,为了这个目的,我不想在检查点之间拆分所有代码块.
有人聪明地知道如何解决这个调试问题?
使您的程序更加模块化.理想情况下,代码的主要部分应该类似于
import config
import my_numerics
import post_processing
my_numerics.configure(config.numerics)
values = my_numerics.run()
post_processing.run(values, config.post_processing)
Run Code Online (Sandbox Code Playgroud)
你明白了.然后很容易制作一个"模拟"数字对象,它返回预先计算的数据,并将其传递给后处理.
编辑:我还是不明白.以下是您的问题的准确伪代码吗?
for _ in range(lots):
do_slow_thing_one()
for _ in range(many):
do_slow_thing_two()
for _ in range(lots_many)
do_slow_thing_three()
Run Code Online (Sandbox Code Playgroud)
也就是说,你想在第三个循环开始时中断运行中途(不是在结尾)中断数字,而不必重新运行前两个?
如果是这样,即使循环不包含太多代码,您也应该将设计模块化:
input_data = np.load(some_stuff)
stage_one = do_thing_one(input_data)
stage_two = do_thing_two(stage_one)
stage_three = do_thing_three(stage_two)
Run Code Online (Sandbox Code Playgroud)
第一种方法是通过隐式接口在不同阶段之间传输数据; 即,局部变量字典.这很糟糕,因为您尚未定义正在使用哪些变量,因此您无法模拟它们以进行测试/调试.第二种方式定义了函数之间的(基本)接口.你现在不再关心它是什么do_thing_one,只要它需要一些输入数据并返回一些输出数据.这意味着调试do_thing_three你可以做到
stage_two = np.load(intermediate_stuff)
stage_three = do_thing_three(stage_two)
Run Code Online (Sandbox Code Playgroud)
只要数据stage_two格式正确,它的来源无关紧要.