当前位置: 首页 > 面试题库 >

在程序中使用Python的“ timeit”,但功能与命令行相同?

高钱青
2023-03-14
问题内容

例如,文档说:

但是请注意,只有在使用命令行界面时,timeit才会自动确定重复次数。

有没有一种方法可以从Python脚本中调用它,并自动确定重复次数,而只返回最短的次数?


问题答案:

当您timeit从命令行这样调用时:

python -mtimeit -s'import test' 'test.foo()'

timeit模块称为脚本。特别地,该main函数称为:

if __name__ == "__main__":
    sys.exit(main())

如果看一下源代码,您会发现该main函数可以带有一个args参数:

def main(args=None):    
    if args is None:
        args = sys.argv[1:]

因此,确实可以timeit程序内部运行,并且行为与从CLI运行时完全相同。只需提供您自己的,args而不是将其设置为sys.argv[1:]

import timeit
import shlex

def foo():
    total = 0
    for i in range(10000):
        total += i**3
    return total

timeit.main(args=shlex.split("""-s'from __main__ import foo' 'foo()'"""))

将打印类似

100 loops, best of 3: 7.9 msec per loop

不幸的是,main打印到控制台,而不是返回每个循环的时间。所以,如果你想以编程方式使用的结果,也许是最简单的方法是通过复制来启动该main功能,然后修改它-
改变打印代码,改为返回usec

OP的示例: 如果将其放置在中utils_timeit.py

import timeit
def timeit_auto(stmt="pass", setup="pass", repeat=3):
    """
    http://stackoverflow.com/q/19062202/190597 (endolith)
    Imitate default behavior when timeit is run as a script.

    Runs enough loops so that total execution time is greater than 0.2 sec,
    and then repeats that 3 times and keeps the lowest value.

    Returns the number of loops and the time for each loop in microseconds
    """
    t = timeit.Timer(stmt, setup)

    # determine number so that 0.2 <= total time < 2.0
    for i in range(1, 10):
        number = 10**i
        x = t.timeit(number) # seconds
        if x >= 0.2:
            break
    r = t.repeat(repeat, number)
    best = min(r)
    usec = best * 1e6 / number
    return number, usec

您可以在如下脚本中使用它:

import timeit
import utils_timeit as UT

def foo():
    total = 0
    for i in range(10000):
        total += i**3
    return total

num, timing = UT.timeit_auto(setup='from __main__ import foo', stmt='foo()')
print(num, timing)


 类似资料:
  • 我遇到了麻烦,对php shell_exec命令感到非常困惑。当命令由PHP执行时,我没有错误,但执行失败。如果我从终端使用完全相同的命令,它就会工作。 命令如下: 当我从终端发来这个: 但是从我的php脚本: 我已经测试了shell_exec的输出,它是空的。 日志: /tmp目录中没有权限pb: 我尝试了avec PHP exec()函数来获取错误信息,我只是在return_var中得到一个“

  • 问题内容: 我想连续执行多个命令: 即(只是为了说明我的需要): (贝壳) 然后 和 并读取的结果。 对模块有任何想法吗? 更新: 而只是一个例子。我需要运行复杂的命令(遵循特定的顺序,没有任何流水线操作)。实际上,我想要一个子进程外壳,并希望能够在其上启动许多命令。 问题答案: 有一种简单的方法可以执行一系列命令。 在以下使用 或者,如果您陷在Windows中,则有多种选择。 创建一个临时的“

  • 问题内容: 我有一个数字清单。该列表以两种方式存储:作为内存中的python对象,或作为redis列表(在同一服务器上设置redis)。 我正在比较使用python检索这两个列表所花费的时间。这是我在python shell中所做的事情: 这给了我一段时间。 接下来,我对内存中的python对象进行计时,如下所示: 这给了我一段时间。也就是说,它似乎比从redis检索相同列表快 约4.5 万倍。

  • 问题内容: 当我尝试使用ssh在远程服务器上执行命令时,ssh命令在调试消息后挂起,并最终超时。 失败的命令:(也尝试过等) 并无限期地挂起。 但是,当我在没有命令的情况下将ssh放入远程服务器时,我得到了一个交互式shell,一切都很好。 成功的命令: 输出: 有谁知道为什么交互式会话会成功但命令执行不会成功? 已经困扰我几个月了,因为我无法再使用统一来同步我的文件了(它曾经可以工作)。任何帮助

  • Basic Example # timeit_example.py import timeit # using setitem t = timeit.Timer("print('main statement')", "print('setup')") print('TIMEIT:') print(t.timeit(2)) print('REPEAT:') print(t.repeat(3,

  • 问题内容: 我们有一个应用程序,它通过拆分数据并对数据进行排序来导入大量文件。运行JUnit测试用例时,整个过程大约需要 16分钟 。 同样的测试,在 34分钟内 完成运行。 我们正在呼吁对文件进行排序。排序似乎需要更长的时间。我不明白有什么不同。 看它运行的IntelliJ 我在OS X上。所有类都使用Spring注入。关于IntelliJ性能提升背后的理论有哪些可能的建议?测试是相同的。我不能