代码之家  ›  专栏  ›  技术社区  ›  David Parks

python日志中字符串的延迟计算:比较`%`与`.format`

  •  0
  • David Parks  · 技术社区  · 7 年前

    import logging
    
    logging.getLogger().debug('test: %i' % 42)
    

    logging.getLogger().debug('test: {}'.format(42))
    

    42 当转换为字符串(例如750万年)时,将被一些长计算替换,该字符串将产生42的最终答案。

    2 回复  |  直到 7 年前
        1
  •  5
  •   Martin    7 年前

    也不懒惰。两个字符串在发送到记录器之前都被插值。python日志的惰性计算是用单独的参数完成的。文件 https://docs.python.org/2/library/logging.html

    logging.getLogger().debug('test: %i', 42)
    

    TL;博士 在这种情况下,更容易考虑以下问题。我们向记录器发送了一个基元类型(字符串),但只有一个参数。所以它不能懒惰。

        2
  •  3
  •   rafaelc    7 年前

    我会查看我在评论中发布的参考资料,了解更多关于 % .format() .

    对于懒惰的评估问题,答案是

    简单的测试就可以了

    def func1(x):
        time.sleep(5)
        return(x)
    
    def func2(x):
        #time.sleep(5)
        return(x)
    
    %timeit 'debug1: %s' % func1(3)
    5 s ± 1.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    %timeit 'debug2: {}'.format(func1(3))
    5 s ± 1.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    %timeit 'debug1: %s' % func2(3)
    297 ns ± 11.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    %timeit 'debug2: {}'.format(func2(3))
    404 ns ± 4.56 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    两者都有 .format % 方法, func()