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即可

 

posted on 2017-05-23 17:36  我和你并没有不同  阅读(336)  评论(0编辑  收藏  举报