LeeReamond
V2EX  ›  问与答

一个 Python 计时器封装的问题

  •  
  •   LeeReamond · Mar 31, 2021 · 1670 views
    This topic created in 2045 days ago, the information mentioned may be changed or developed.

    日常编程中,常常纠结于哪种实现方式运行速度更快,需要对一些简短的 codeblock 进行测试

    python 虽然有一个成熟的 timeit 生态,但是 timeit 的缺点是提供测试结果比较严谨,准备测试环境相对来说复杂一些。而这类日常的测试则不需要严谨的对比,通常只需要定性,哪个大略上更快一些,但是希望更加易用,写一行代码立即跑出结果,所以 timeit 并不是十分符合需求。

    所以实际开发中通常倾向于手写一些小工具来实现计时,一般思路是使用上下文管理器,在进入和退出指定 block 的时候统计运行时间即可,并且这种做法不会形成单独 scope,不影响上下文数据结构。

    现在有一个问题就是,通常性能对比需要循环执行才能看出差异,所以要写很多多余代码,比如

    with timeit():
        for _ in range(1e8):
            ... # 真正需要测试的代码段
    

    感觉每次都要重复写一个 for 循环挺麻烦的,有没有办法把这部分逻辑封装在对象里呢?

    让使用上变成这种感觉

    with timeit(1e8):
        ... # 需要测试的代码段
    

    我是没什么思路,不知道怎么才能做到,有没有大佬分享一下想法

    8 replies  •  2021-04-03 21:32:37 +08:00
    F281M6Dh8DXpD1g2
    F281M6Dh8DXpD1g2
    Mar 31, 2021❤️1
    1
    装饰器啊
    charexcalibur
    charexcalibur
    Mar 31, 2021
    2
    装饰器
    LeeReamond
    LeeReamond
    OP
    Mar 31, 2021
    3
    @liprais
    @charexcalibur

    装饰器方案比现在更拉胯,比如我有一个简单的需求,我有某个列表,需要把里面内容全部+2,完全用原生实现我要考虑是循环速度快还是列表生成器速度快,像下面这两段代码

    https://gist.github.com/GoodManWEN/23274b3bcdd6fbeb352bea9f44b85441

    我用现在的方案,实现循环我需要多写一行 for _ in range(1e8):,如果用装饰器,还要多定义一个函数,并且引入一个新的 scope,语法没有变简洁,问题变多。
    volvo007
    volvo007
    Apr 1, 2021 via iPhone
    4
    @LeeReamond 装饰器,是的,即使看到了你的抱怨,还是装饰器
    多写写习惯就好。话说回来,函数套函数怎么就难了
    LeeReamond
    LeeReamond
    OP
    Apr 1, 2021 via Android
    5
    @volvo007 显然套函数需要先定义,再调用,写两行代码多于原先一行代码,这是其一。同时函数引入新的 scope,单独测试段落引起上下文定义缺失问题,这是其二,以上两点是否很难理解?
    xiaolinjia
    xiaolinjia
    Apr 3, 2021
    6
    @LeeReamond 之前用的 pysnooper 库有 with 块的实现,跟你的需求有点类似,或许可以看看源码改造下。
    https://github.com/cool-RR/PySnooper
    xiaolinjia
    xiaolinjia
    Apr 3, 2021
    7
    https://www.v2ex.com/t/766801#reply6 我简单得写了一个。
    xiaolinjia
    xiaolinjia
    Apr 3, 2021
    8
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4854 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 08:39 · PVG 16:39 · LAX 00:39 · JFK 03:39
    ♥ Do have faith in what you're doing.