在思考代码的优化时,我想知道哪些在python中更贵:
if x:
d = 1
else:
d = 2
或
d = 2
if x:
d = 1
有什么想法?我喜欢第二次减少的行数,但想知道重新分配是否比条件切换更昂贵。
答案 0 :(得分:20)
不要思考,不要怀疑,衡量 - 在shell命令行中使用timeit
(到目前为止最好,最简单的方式用它!)。在笔记本电脑上的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
所以你看到:当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
...... 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
现在您可以声明表达式表单(在此计算机和关键软件的版本上)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纳秒是相当公平的,比较最小/最小和最大/最大而不是最小/最大和最大/最小的,更谨慎的估计确实。)
一旦你意识到他们 微观的,任何特定的护理,当你是一个不同的问题时,多少时间和精力值得投入这种微观差异。
答案 1 :(得分:5)
您应该对此进行基准测试,但也有第三种使用三元运算符的形式:
d = 1 if x else 2
答案 2 :(得分:2)
第二个显然应该更昂贵,如果x
为假,它会执行相同的操作,如果x
为真,则执行两次分配。
假设:python中的赋值比条件跳转更昂贵,因为它的解释是有意义的,它必须读取运行时散列以获取新值,然后将其上传到相同的散列中。
答案 3 :(得分:1)
我认为最具可读性的是最优化的(至少为了可读性)。
if ... else结构清楚表明你正在处理这两种情况。
如果(d == 2)是通常的值而你的if测试了一个不寻常的情况,那么赋值结构可能更有意义。如果您的作业从if。
移开,则此构造变得不那么清晰在这个简单的例子中,它并不重要。对于更复杂的代码,我几乎总是优化可读性,即使以几个CPU周期为代价。