避免vscode远程调试python变卡的好习惯

原则:编程时与调试时,保证程序与配置文件是能够正常运行的最小化代码。程序功能最好能够分解开,单独调试。
具体场景一、想调试某个文件,在launch.json中,如果这个文件不需要在控制台接收参数,那么把配置中的args删除。因为使用args配置了参数,会导致程序加载了不必要配置,执行了非预期的逻辑。这些非预期的逻辑中,可能包含计算非常慢的代码。

{
    "name": "Python: Current File",
    "type": "python",
    "request": "launch",
    "program": "${file}",
    "console": "integratedTerminal",
    "justMyCode": false,    
    "args": [              
    ],
}

具体场景二、Python导包,导入满足运行条件的最小的函数与类。
尽量使用 from xxx import yyy来选择性导入需要用的包,直接使用import xxx,它会加载xxx中的所有import语句与全局执行的语句,这样,不知道什么地方,会有一句代码,会影响到正常的调试,不方便定位错误。
例子:入口脚本程序中引入了一个自定义的包,这个包中使用pytorch时,并且设置了如下的打印选项。

import torch
torch.set_printoptions(profile='full')

它会的非常的慢。实测在NVIDIA GeForce RTX 2080 Ti,在DEBUG CONSOLE中打印一个这样的变量:[Tensor(shape=(663, 655), dtype=torch.bool), Tensor(shape=(663, 655), dtype=torch.bool)], 大概需要18.23s。相当的慢。
如果调试的程序中,包含特别多的包,那么定位到引起调试代码,单步调试特别慢的原因,不是很容易。

卡顿情况定位经验总结

现象:程序中调用mmdetection推理的函数的代码,在debug过程中,单步执行一步特别慢,需要20s以上。
1 我怀疑与mmdetection推理的接口函数有关。那么,我单独整了python文件,里面编写mmdetection推理demo的最小化、最简单的代码。并debug这个python文件,发现debug很正常。没有问题。
2 我褪掉多余的代码封装,针对最里层的类,单独整了个测试demo。对最里层的类,代码上,仅保留完成mmdetection推理、推理后结果打印,其它所有清空。并且import的包,仅保留不报错的最少类的包,其它导入的包全部删除。这样再做测试,发现在debug过程中,单步执行一步速度变正常了。
3 在上一步的基础上,每一次加一点代码块,并测试debug过程单步执行一步的速度。一直增加到会让程序变慢的那个代码块。对让程序变慢的代码块,可以再细粒度的从不会变慢的最小化代码版本上,慢慢增加代码,一直到增加到出现让程序变慢的代码,即定位到了程序变慢的代码。


楚知行
18 声望4 粉丝