zoukankan      html  css  js  c++  java
  • 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所有的方法是使用指针操作

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Redis 简介
    图片懒加载、selenium和PhantomJS
    Python网络爬虫之三种数据解析方式
    Scrapy框架之CrawlSpider
    Scrapy 框架
    python 网络爬虫概念与HTTP(s)协议
    Mysql概念及基本操作
    Python re 模块
    线程与进程应用场景
    全局解释器锁 GIL
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4850919.html
Copyright © 2011-2022 走看看