【问题标题】:I want Python class/function to approximate IPython %%timeit我希望 Python 类/函数近似于 IPython %%timeit
【发布时间】:2021-04-06 11:23:32
【问题描述】:

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

  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 jupyter-notebook ipython timeit


    【解决方案1】:

    简短的回答是,您不能在 py 文件/纯 Python 代码块中执行此操作。

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

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

    .... 或者你创建一个使用多行字符串而不是 Python 代码块的 API,这很丑但可以工作。

    更一般地说,如果您认为我们可以在 IPython 中使代码块更可重用,请随时打开问题/拉取请求。

    【讨论】:

    • 我(还)不接受这个答案,因为它太令人沮丧了!其他人可以权衡以确认@Matt 的评价吗?
    • 作为额外信息;我在 IPython 中编写了大部分 timeit 代码,并且很想被证明是错误的。另请参阅具有 Python 宏并将其用于 timeit 的 Xonsh。 xon.sh/tutorial_macros.html
    猜你喜欢
    • 2019-01-15
    • 2021-10-28
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多