不要思考,也不要怀疑,在shell命令行使用timeit来度量(到目前为止,这是最好、最简单的使用方法!)。MacOSX 10.5上的Python2.5.4在笔记本电脑上…:$ python -mtimeit -s'x=0' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0748 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0685 usec per loop
$ python -mtimeit -s'x=0' 'd=2' 'if x: d=1'
10000000 loops, best of 3: 0.0734 usec per loop
$ python -mtimeit -s'x=1' 'd=2' 'if x: d=1'
10000000 loops, best of 3: 0.101 usec per loop
因此,您可以看到:与“if/else”形式相比,“just if”表单在x为false时可以节省1.4纳秒,但是在x为true时要花费40.2纳秒;因此,在微优化上下文中,只有当x的false可能性是true的30倍左右时,才应该使用前者。同时:
^{pr2}$
…if/else的三元运算符有自己的极小的加号和减号。在
当差异如此之小时,你应该反复测量,确定噪音水平,并确保你没有把“噪音”的差异视为显著。例如,要比较“x is true”情况下的语句与表达式if/else,请分别重复几次:$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.076 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0749 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0742 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0749 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0745 usec per loop
现在您可以声明表达式的形式(在这台机器和关键软件的版本上)为74.2到76.0纳秒——这个范围比任何单个数字都要表达得多。同样:$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0688 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0681 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0687 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0679 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0692 usec per loop
现在您可以自信地声明语句形式(在相同条件下)需要67.9到69.2纳秒;因此,对于x true,与表达式形式相比,它的优势是4.8到8.1纳秒(将后一个间隔估计限制在6.3到6.8纳秒是相当公平的,比较最小值/最小值和最大值/最大值,而不是最小值/最大值和最大值/最小值,因为这是更广泛、更谨慎的估计值)。在
一旦你意识到这些微小的差异是微小的,那么你需要花多少时间和精力去处理这些细微的差异,这当然是一个不同的问题。在