【问题标题】:Inconsistency between timieit with number and timeit without a number带数字的timeit和不带数字的timeit不一致
【发布时间】:2018-08-21 19:28:41
【问题描述】:

我注意到,在使用常规参数运行 timeit 和使用参数 number=1 运行 timeit 之间,结果变化很快。这是我找到的示例。

import sympy as sp
import numpy as np
var = (sp.Symbol("x"), sp.Symbol("y"), sp.Symbol("z"))
x,y,z = var[0], var[1], var[2]
monos = np.array([1, z, y, x, z**2, y*z, y**2, x*z, x*y, x**2, z**3, y*z**2, y**2*z, y**3, x*z**2, x*y*z, x*y**2, x**2*z, x**2*y, x**3, z**4, y*z**3, y**2*z**2, y**3*z, y**4, x*z**3, x*y*z**2, x*y**2*z, x*y**3, x**2*z**2, x**2*y*z, x**2*y**2, x**3*z, x**3*y, x**4])
f = sp.lambdify(var, monos)
import testit
timeit.timeit("(f(2,3,4))", setup="from __main__ import f") 
#returns 2.0760600566864014
timeit.timeit("(f(2,3,4))", setup="from __main__ import f", number=1)
#returns 1.5974044799804688e-05

我使用的是 python2 2.7.12 版和 sympy 1.2 版。这是怎么回事?

【问题讨论】:

  • 您是否期望这个函数完全一样地工作,而不管您传递给它的参数是什么?你看过corresponding docs吗?他们对数字参数有什么看法?

标签: python numpy sympy timeit


【解决方案1】:

与 IPython %timeit 不同,timeit.timeit 返回所有运行所用的总时间。要获得个人跑步的时间,您必须除以数字。您还可以使用 timeit.Timer(stmt).autorange()(仅限 Python 3.6+),它会自动选择运行次数。

我建议使用 IPython %timeit 进行计时。它只能以交互方式工作,但比标准库中的timeit 模块更容易使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多