你是否有遇到过这样的问题,从同事那里接手了1份古代代码想要修改,却看得头昏脑胀,不知从哪里改起?
快使用同事追踪器吧!
同事追踪器使用数十种名贵药材,历经9年烹饪,并加入了珍稀的莉沫酱提取物,可以快速解决你的1切问题!
假如你的同事写了这样1个工程,它用来煎几个荷包蛋然后吃掉,虽然听起来很简单但是实际上有1000行。
但是它上线以后经常崩溃,得尽快调查一下出错的原因。
eggs = [*range(5)]
锅里 = []
餐桌 = []
def 打破(egg):
try:
import 奇怪的第三方库
except Exception:
...
def 翻面(egg):
马: None
def 铲出来():
global 锅里
t = 锅里
锅里 = []
return t
def 下锅(egg):
锅里.append(egg)
def 煎蛋(eggs):
for egg in eggs:
打破(egg)
下锅(egg)
for _ in range(3):
[*map(翻面, 锅里)]
res = 铲出来()
return res
def 做菜():
菜 = []
for i in range(0, len(eggs), 2):
菜.extend(煎蛋(eggs[i:i + 2]))
return 菜
def 上桌(t):
餐桌.extend(t)
def 吃掉(egg):
...
t = 做菜()
上桌(t)
for egg in 餐桌:
吃掉(egg)
接下来,只要你在入口文件的头部加上同事追踪器,然后重新运行代码——
from cotrace import auto_call_trace
auto_call_trace([__file__])
就可以看到代码打印出了每个函数的实际调用关系和执行顺序啦!
时间 | 函数名 位置 | 次数
==================================================
0.065|<module> [L1, 菜.py]|
0.065| 做菜 [L33, 菜.py]|
0.065| 煎蛋 [L25, 菜.py]|
0.066| 打破 [L11, 菜.py]|
0.067| 下锅 [L23, 菜.py]|
0.067| 打破 [L11, 菜.py]|
0.068| 下锅 [L23, 菜.py]|
0.068| 翻面 [L16, 菜.py]| * 6
0.068| 铲出来 [L18, 菜.py]|
0.069| 煎蛋 [L25, 菜.py]|
0.069| 打破 [L11, 菜.py]|
0.069| 下锅 [L23, 菜.py]|
0.070| 打破 [L11, 菜.py]|
0.071| 下锅 [L23, 菜.py]|
0.071| 翻面 [L16, 菜.py]| * 6
0.071| 铲出来 [L18, 菜.py]|
0.071| 煎蛋 [L25, 菜.py]|
0.071| 打破 [L11, 菜.py]|
0.072| 下锅 [L23, 菜.py]|
0.072| 翻面 [L16, 菜.py]| * 3
0.073| 铲出来 [L18, 菜.py]|
0.073| 上桌 [L38, 菜.py]|
0.073| 吃掉 [L40, 菜.py]| * 5
我们只需要读同事追踪器的结果,就可以理清这段代码的逻辑:
蛋有5个,煎蛋被调用了3次,各煎了2/2/1个蛋,说明它是分块操作的。
每次煎蛋前要把蛋依次打破和下锅,全部下锅完了之后再1个1个翻面。最后再1口气铲出来。
最后再把5个蛋1起端上桌,然后1个1个吃掉。
然后我们就可以快速地发现代码里可以优化的地方,比如:
-
上桌不是逐元素操作,可能蛋太多了一次端不上来?
-
煎蛋的流程太长了,可能前面的蛋最后都凉了?
之后你就可以有针对性地去优化同事的代码啦。
你需要1个Python3.6以上版本,并通过pip安装cotrace。
pip install git+https://github.com/RimoChan/cotrace.git
安装好以后就可以import cotrace
来使用啦。
接口说明:
def auto_call_trace(paths, *, width=60, indent=2): ...
-
paths
: 需要追踪的文件的路径列表。当函数所在的文件(或其祖先目录)在这个列表里就会被追踪。
追踪当前文件可以用[__file__]
。
追踪当前文件夹可以用[__file__+'/..']
。 -
width
: 输出的宽度。 -
indent
: 输出的缩进格数。
如果你觉得同事追踪器对你的工作或学习有所帮助,欢迎给作者送1些萝莉同事过来。
就这样,大家88,我要回去提炼莉沫酱了!