Gav*_*Roy 3 python micro-optimization
在思考代码的优化时,我想知道哪些在python中更贵:
if x:
d = 1
else:
d = 2
Run Code Online (Sandbox Code Playgroud)
要么
d = 2
if x:
d = 1
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?我喜欢第二次减少的行数,但想知道重新分配是否比条件切换更昂贵.
Ale*_*lli 20
不要思考,不要怀疑,测量 - 使用timeit shell命令行(到目前为止最好,最简单的方式使用它!).在笔记本电脑上的Mac OSX 10.5上的Python 2.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
Run Code Online (Sandbox Code Playgroud)
所以你看:当x为假时,"just-if"形式可以节省1.4纳秒,但是当x为真时,与"if/else"形式相比,成本为40.2纳秒; 因此,在微优化环境中,只有当x的误差可能比真实或其他地方低30倍时,才应使用前者.也:
$ python -mtimeit -s'x=0' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0736 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.076 usec per loop
Run Code Online (Sandbox Code Playgroud)
... if/else的三元运算符有其自己的微小优缺点.
当差异如此微小时,你应该重复测量,确定噪声水平是什么,并确保你没有把"噪音"中的差异视为重要.例如,要在"x为真"的情况下比较语句与表达式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
Run Code Online (Sandbox Code Playgroud)
现在你可以说表达式表达式(在这台机器和关键软件的版本上)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
Run Code Online (Sandbox Code Playgroud)
现在你可以自信地说明声明表格(在相同的条件下)需要67.9到69.2纳秒; 所以它的优势,对于x true,表达形式,是4.8到8.1纳秒(将后一个区间估计限制在6.3到6.8纳秒是相当公平的,比较最小/最小和最大/最大而不是最小/最大和最大/最小,更谨慎的估计确实).
一旦你意识到任何特定的护理它们是微观的,那么多少时间和精力值得投入这种微观差异,当然,这是一个不同的问题.
您应该对此进行基准测试,但也有第三种使用三元运算符的形式:
d = 1 if x else 2
Run Code Online (Sandbox Code Playgroud)