Python:切换“详细”输出的最有效方法?

时间:2013-02-19 19:55:52

标签: python logging function-pointers

所以,我有一个带有大量调试输出的脚本,我可以使用-v标志打开/关闭。我目前的代码如下:

def vprint( obj ):
    if args.verbose:
        print obj

但是,我认为这是低效的,因为每次调用vprint()时,都必须跳转到该函数并检查args.verbose的值。我想出了这个,这应该稍微有点效率:

if args.verbose:
    def vprint( obj ):
        print obj
else:   
    def vprint( obj ):
        pass

现在删除了if,但它仍然必须跳转到该功能。所以我想知道是否有一种方法可以将vprint定义为一个无处可去的函数指针,所以它可以完全跳过它?或者Python是否足够聪明,知道不要浪费时间只使用pass的函数?

1 个答案:

答案 0 :(得分:4)

除非您的性能分析引导您,否则可能不值得优化。一组快速测试比1000000次迭代产生了一个小的(0.040)改进:

         1000004 function calls in 0.424 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.424    0.424 <string>:1(<module>)
        1    0.242    0.242    0.424    0.424 test.py:14(testit)
        1    0.000    0.000    0.424    0.424 test.py:21(testit1)
  1000000    0.182    0.000    0.182    0.000 test.py:6(vprint)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


         1000004 function calls in 0.408 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.408    0.408 <string>:1(<module>)
  1000000    0.142    0.000    0.142    0.000 test.py:10(vprint2)
        1    0.266    0.266    0.408    0.408 test.py:14(testit)
        1    0.000    0.000    0.408    0.408 test.py:18(testit2)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

测试代码如下;

#!/usr/bin/python

import cProfile

verbose=False
def vprint(msg):
    if verbose:
        print msg

def vprint2(msg):
    pass

def testit(fcn):
    for i in xrange(1000000):
        fcn(i)

def testit2():
    testit(vprint2)

def testit1():
    testit(vprint)

if __name__ == '__main__':
    cProfile.run('testit1()')
    cProfile.run('testit2()')