IPython或Jupyter笔记本中的%%timeit
有两个我喜欢的功能。
-
在有限的时间内运行,自动调整给定批次数的迭代次数。
-
输出为平均值+标准差。这比许多跑步中的最短跑步时间要好。
以下是IPython终端的输出示例。第一个来自";慢速版本";对于一个函数,第二个来自更快的版本。
In [21]: %timeit hh = gg.get_map(form="232", year=2019, source="form")
1.82 s ± 111 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [18]: %timeit jj = fm.get_map(form="232", year=2019, source="form")
324 µs ± 22.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
请注意,当函数速度较慢时,它会返回7 x 1的执行次数,但当它速度较快时,它最多会拨打7 x 1000。
我一直在研究IPython代码,以了解它们是如何做到这一点的,我认为我可以适应python代码块。这是一项艰巨的工作!它把我带入了一个陌生的领域,与AST互动。
在我看来,肯定有人以前做过这种事。没有Python包吗?
简单的答案是,在纯Python代码的py文件/块中无法做到这一点。
一旦解析了文件,就无法从Python中获取AST。这就是";宏";,是Python中经常要求的功能,因为它们可以让你做这样的事情。
可能有一些技巧性的方法,但粗略地说,你需要找到定义代码的文件,并将内容作为字符串进行操作;IPython可以做什么,就像它自己做解析一样。
或者您制作一个API,它采用多行字符串而不是Python代码块,这很丑陋,但可以工作。
更一般地说,如果您认为我们可以在IPython中使代码块更加可重用,请随时打开问题/拉取请求。