python变量交换性能优化

多方面新讲python性能优化看到交换两个变量的值可以使用

a,b = b,a
这样可以提高性能

>>> from timeit import Timer
>>> Timer("t=a;a=b;b=t","a=1;b=2").timeit()
0.06279781319366587
>>> Timer("a,b=b,a","a=1;b=2").timeit()
0.0378979925538232
>>>

从运行时间上看,确实节省了快一半的时间

通过dis得到python字节码

>>> def func():
...     a,b = b,a
...
>>> import dis
>>> dis.dis(func)
  2           0 LOAD_FAST                0 (b)
              3 LOAD_FAST                1 (a)
              6 ROT_TWO
              7 STORE_FAST               1 (a)
             10 STORE_FAST               0 (b)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE
>>>

可以看出主要是ROT_TWO指令的功劳:

查阅python文档可以知道有ROT_TWO ROT_THREE ROT_FOUR这样的指令,可以直接交换两个变量、三个变量、四个变量的值

在python3.4的源码中查阅ceval.c文件可以看到:

       TARGET(ROT_TWO) {
            PyObject *top = TOP();
            PyObject *second = SECOND();
            SET_TOP(second);
            SET_SECOND(top);
            FAST_DISPATCH();
        }

        TARGET(ROT_THREE) {
            PyObject *top = TOP();
            PyObject *second = SECOND();
            PyObject *third = THIRD();
            SET_TOP(second);
            SET_SECOND(third);
            SET_THIRD(top);
            FAST_DISPATCH();
        }
就是这些指令的具体C语言实现了
归根究底,速度快还是因为a,b = b,a的方式全部是使用指针操作

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值