调试慢程序; 从中间重启

Ger*_*nuk 14 python debugging

我有一个计算速度慢的程序,我希望调试算法.现在总是重新运行所有内容非常繁琐,我宁愿从程序中间重新启动.你能想到一些聪明的方法来实现这个目标吗?

第一个模糊的想法是定义检查点(我在其中进行函数调用),其中我用pickle和/或sqlite保存本地和大数据(sqlite能够检查中间数据).后来我可以尝试调用程序告诉它在特定检查点重新启动.但是,为了这个目的,我不想在检查点之间拆分所有代码块.

有人聪明地知道如何解决这个调试问题?

Kat*_*iel 6

使您的程序更加模块化.理想情况下,代码的主要部分应该类似于

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格式正确,它的来源无关紧要.


Lau*_*low 1

谷歌搜索让我找到了CryoPID,如果您在基于 Linux 的系统上进行开发,它可能可以完成这项工作。它声称能够暂停进程并将其保存到文件中,然后重新启动它,即使在另一台计算机上也是如此。不过我还没有测试过。