要酱紫:
newlist = map(str.upper, oldlist)
或者酱紫:
newlist = [s.upper() for s in oldlist]
字典初始化,比较常用的:
wdict = {} for word in words: if word not in wdict: wdict[word] = 0 wdict[word] += 1
如果重复的 word 太多了的话,可以考虑用酱紫的模式来省掉大量判断:
wdict = {} for word in words: try: wdict[word] += 1 except KeyError: wdict[word] = 1
尽量减少 function 调用次数,用内部循环代替,比如,不要酱紫:
x = 0 def doit1(i): global x x = x + i list = range(100000) t = time.time() for i in list: doit1(i)
要酱紫:
x = 0 def doit2(list): global x for i in list: x = x + i list = range(100000) t = time.time() doit2(list)
第三招:蛇之狙击:高速搜索
这一招部分来源于IBM:Python 代码性能优化技巧,搜索算法的最高境界是O(1)的算法复杂度。也就是 Hash Table。本人幸本科的时候学了点数据结构。知道 Python 的 list 使用类似链表的方法实现的。如过列表很大的话,在茫茫多的项里面用 if X in list_a 来做搜索和判断效率是非常低的。
Python 的 tuple 我用得非常少,不评论。另两个我用得非常多的是 set 和 dict。这两个就是用的类似 Hash Table 的实现方法。
所以尽量不要酱紫:
k = [10,20,30,40,50,60,70,80,90] for i in xrange(10000): if i in k: #Do something continue
要酱紫:
``` k = [10,20,30,40,50,60,70,80,90] k_dict = {i:0 for i in k}
先把 list 转换成 dictionary
for i in xrange(10000): if i in k_dict: #Do something continue ```
找 list 的交集,不要酱紫:
list_a = [1,2,3,4,5] list_b = [4,5,6,7,8] list_common = [a for a in list_a if a in list_b]
要酱紫:
list_a = [1,2,3,4,5] list_b = [4,5,6,7,8] list_common = set(list_a)&set(list_b)
第四招:小蛇蛇……:想不出来名字了,就是各种小 Tips
变量交换不需要中间变量:a,b = b,a (这里有个神坑,至今记忆深刻:True,False = False,True)
如果使用 Python2.x,用 xrange 代替 range,如果用 Python3.x,range 已经是 xrange 了,xrange 已经木有了。xrange 不会像 range 一样生成一个列表,而是生成一个迭代器,省内存。
可以用 x>y>z 代替 x>y and y>z。效率更高,可读性也更好。当然理论上 x>y
add(x,y) 一般会比 a+b 要快?这个本人有所怀疑,实验了一下,首先 add 不能直接用,要 import operator,第二,我的实验结果表示 add(x,y) 完全没有 a+b 快,更何况还要牺牲可读性。
while 1 确实比 while True 要快那么一点点。做了两次实验,大概快了15%左右。










