• python的几个注意事项


    ,==============坑=======

    1、可变类型的值不要作为函数参数默认值,应该是不可变的对象,如None,True,False,数字或字符串

    2、小心+=

    a = range(10) b = range(5) a_orig = a a += b print a print a_orig    # a_orig在以上处理过程中取值被改变了。
    a = range(10) b = range(5) a_orig = a a = a + b print a print a_orig    # a_orig还是原来的值,没有变。

     3、range (10000000)后,内存不释放的原因:python对整数对象做了缓存,新创建出来的整数对象的内存不会被释放,而是留着以后再次创建整数对象时继续使用。这样可以减少new操作,提高效率。range (10000000)会同时创建大约10000000个整数对象,这些内存都不会释放给系统。

    =========性能=======

    1、xrange的性能、内存占用都比range好(range返回的是list,xrange返回的是迭代对象,省内存,在每次迭代时,根据步长计算出下一个值,内存占用少,性能比较好

     2、局部变量的访问速度,比全局变量、内建变量都要快,如果函数中,需要频繁使用某个全局变量或内建函数时,那么可以考虑先将这个全局变量或内建函数赋值给一个局部变量,后面代码直接访问这个局部变量

    3、,比自己for要效率高

     4、

     5、虽然python是动态语言,但是在执行python代码前,也有编译的过程。平时大家看到的pyc文件就是python编译后的结果

    6、当代码中需要使用不需要改变的序列时,应该采用tuple,而不是list; 用tuple效率更高

    7、创建一个list:

    法一:

    result = []

            for item in src:

                if item%2 == 0:

                    result.append(item)

    由于python是动态语言,python运行到result.append(item)代码时,它并不知道这里是调用了list的append方法,它只能是按照通用的方式来执行:

    1)        加载变量result

    2)        找到变量result的名称为"append"的方法

    3)        执行该方法

    //////////////////////////////////////

    法二:法二比法一更快

    result = [item for item in src if (item%2)==0]

    我们已经通过result = [item for item in...]的方式让python在编译期间就知道这里是够造一个list,所以python在运行期间就直接调用了append方法,省去了查找名称为“append”函数的过程

    8、合并两个list,用extend比append要快

    每当append元素时,list发现当前数组的大小不够用时,会resize内存。所以append()会导致多次重分配内存,影响了性能。而list在执行+操作时,会事先算好需要的内存大小,并一次性调整好。

    法一:

    tmp = []

            for item in src:

                tmp.append(item)

    法二:

    tmp = []

            tmp+=src   #or tmp.extend(src)

    9、判断字符串是否已***开头

    src_str.find(sub_str) 性能最差;  src_str.startswith(sub_str) 性能中等;  src_str[:len(sub_str)] == sub_str 性能最好。综合来看,推荐src_str.startswith(sub_str),因为其可读性要比其他二者要好

     10、xx is None的性能比xx == None的性能好

    a is b,其实只是比较a和b的内存地址是否相同,如果a和b的地址相同,那么a和b必然是同一个对象。a == b,首先会比较a和b的地址是否相同,如果地址相同,则直接返回True了,如果地址不同,则会继续比较a和b的内容,所以比 a is b要慢。

    python中None、False、True是存放在唯一的一个内存中,只有在地址相同的情况下,才会等于None、False、True,所以可以使用is代替==。类、函数变量也可以如此。其他情况不能使用is 代替==

    11、需要被频繁运行的代码部分,尽量不要使用exec,因为exec中传入的代码是无法事先经过编译的,只能在每次运行到exec时临时编译成python指令,性能非常低。

    如果exec中仅仅给某个变量赋值,那么可以使用eval代替(eval性能也不高,但是比exec要好一点)

    12、import只能导入模块,不能导入模块中的对象(类、函数、变量等),如果想只导入特定的类、函数、变量则用from A import getName即可

  • 相关阅读:
    JSP——隐式对象(implicit object)
    Spring——原理解析利用反射和注解模拟IoC的自动装配
    Spring操作指南针对JDBC配置声明式事务管理(基于注解)
    SpringMVC操作指南登录功能与请求过滤
    Spring操作指南针对JDBC配置声明式事务管理(基于XML)
    Flex Tree 限制只能同级拖动 获得拖动前后节点信息
    坐标系、坐标参照系、坐标变换、投影变换【转】
    国内地图偏移的一些知识
    Web Mercator
    WKT【转】
  • 原文地址:https://www.cnblogs.com/testzcy/p/6895170.html
Copyright © 2020-2023  润新知