安利一下自制debug工具:SuperDebug,尤其适合从事机器学习、数据科学的程序猿们
GitHub链接:觉得好用就给个⭐️吧~
https://github.com/Azure-Vision/SuperDebuggithub.com/Azure-Vision/SuperDebug
习惯使用print(var)
打印debug?没问题,现在你只需要换成debug(var)
即可,学习成本几乎为0,但是功能却远比print
强大。
准备工作:在需要debug的工程目录下添加debug.py(需要从GitHub上下载),在其他文件中import:from debug import debug, mark
让我们看看这套工具都支持哪些功能吧:
功能1: debug(var)
用黄色字体打印(与普通的打印区分):
debug(var)
所在位置,如"/path/to/file.py", line 666, in some_function
(command / ctrl + 单击 即可跳转到文件中debug(var)
所在行,看看究竟是附近哪里有bug)- 数组形状(AI小白傻fufu不知道每个tensor长什么样?debug一下便知。仅限list、numpy的array、torch的tensor)
var
的具体值
进阶功能:还不熟悉的同学可以先跳过 (需要更改debug.py中的开关)
- 一次性打印多个变量:
debug(var1, var2, var3, ...)
- 同步输出在终端(
PRINT = True
)和同目录下的debug.log文件中(TO_FILE = True
) - 对于一些循环程序,你或许只想打印有限次,只需设置
MAX_LOG = 想打印的次数
即可 - 如果你希望只打印变量的形状,而不打印变量的内容,可以使用
debug(False, var)
- 打印完整矩阵内容,禁止pytorch、numpy自动省略:
FULL = True
- 对于一些套娃的list / dict,可以控制详细打印至第几层,标准为0,建议用3:
PEEK_LAYER = 0
功能2: mark(var)
运行了这么长时间。。。为什么程序还没有跑完?
不用慌,在代码的关键节点插入mark()
,如果程序有运行到这个位置,就会用黄色字体打印出所在位置,如"/path/to/file.py", line 666, in some_function
。
在代码中,像“沿路洒下小石子”一样,插入多个mark()
,你就知道程序是在哪里卡住啦~
进阶功能:
若过有输入具体变量mark(var)
,则会用黄色字体打印出 var
的值。(若仅用mark()
而无输入,则打印mark()
所在的位置)
功能3: 在出错时跳至ipdb调试界面,便捷debug
自动停在出错的那一步(需设置BUGGY = True
):当出现Exception,程序不会退出,而是会暂停在出现Exception的那一步。
这时你可以使用var
(输出var的值), up
(上一步), down
(下一步)等控制命令进行调试。更多命令同ipdb
功能4: 在指定位置停下(设置断点)
在想设置断点处写 raise Exception()
,与功能3同理,程序将会停在exception处