所以,我有一个带有大量调试输出的脚本,我可以使用-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
的函数?
答案 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()')