我希望 Python class/function 接近 IPython %%timeit

I want Python class/function to approximate IPython %%timeit

%%timeit 在 IPython 或 Jupyter notebook 中有 2 个我喜欢的功能。

  1. 运行限时,给定批次数自动调整迭代次数

  2. 输出为均值 + 标准差。这比许多 运行 中的最小 运行 时间要好。

这里是 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 file/block 中执行此操作。

一旦文件被解析,您就无法从 Python 中获取 AST。这是“宏”是 Python 中经常要求的功能的原因之一,因为它们可以让您做这样的事情。

可能有一些 hacky 方法,但粗略地说,您需要找到定义代码的文件,并将内容作为字符串获取以对其进行操作; IPython 可以做什么,因为它自己进行解析。

... 或者你制作一个 API 接受多行字符串而不是 Python 代码块,这很丑陋但可以工作。

更一般地说,如果您认为我们可以在 IPython 中提高代码块的可重用性,请随时打开 issue/pull 请求。