gpt4 book ai didi

python - 调试慢程序;从中间重新开始

转载 作者:太空狗 更新时间:2023-10-29 17:19:20 26 4
gpt4 key购买 nike

我有一个计算速度很慢的程序,我想调试算法。现在总是重新运行一切是非常乏味的,我宁愿从程序的中间重新启动。你能想出一些巧妙的方法来实现这一目标吗?

第一个模糊的想法是定义检查点(我进行函数调用的地方),我在其中使用 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)

你明白了。然后很容易制作一个“模拟”数字对象,它返回预先计算的数据,并将其传递给后处理。


编辑:我还是不明白。以下伪代码是否适用于您的问题?

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

也就是说,您想在运行的中途(而不是结束时)中断数字,比如在第三个循环开始时,而不必重新运行前两个?

如果是这样,即使循环不包含太多代码,您也应该模块化设计:

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)

第一种方法是通过隐式接口(interface)在不同阶段之间传输数据;即局部变量字典。这很糟糕,因为您还没有定义正在使用哪些变量,因此您不能为了测试/调试目的而模拟它们。第二种方式定义函数之间的(基本)接口(interface)。您现在不再关心 do_thing_one 做了什么,只要它接受一些输入数据并返回一些输出数据即可。这意味着要调试 do_thing_three 你可以这样做

stage_two = np.load(intermediate_stuff)
stage_three = do_thing_three(stage_two)

只要 stage_two 中的数据格式正确,它来自哪里都没有关系。

关于python - 调试慢程序;从中间重新开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7244369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com