1.使用map()進行函式映射
? Exp1:將字串陣列中的小寫字母轉為大寫字母,
測驗陣列為 oldlist = ['life', 'is', 'short', 'i', 'choose', 'python'],
- 方法一
newlist = [] for word in oldlist: newlist.append(word.upper())
- 方法二
list(map(str.upper, oldlist))
方法一耗時 0.5267724000000005s,方法二耗時 0.41462569999999843s,性能提升 21.29% ??
2.使用set()求交集
? Exp2:求兩個list的交集,
測驗陣列:a = [1,2,3,4,5],b = [2,4,6,8,10],
- 方法一
overlaps = []
for x in a:
for y in b:
if x == y:
overlaps.append(x)
- 方法二
list(set(a) & set(b))
方法一耗時 0.9507264000000006s,方法二耗時 0.6148200999999993s,性能提升 35.33% ??
關于set()的語法:|、&、-分別表示求并集、交集、差集,
3.使用sort()或sorted()排序
我們可以通過多種方式對序列進行排序,但其實自己撰寫排序演算法的方法有些得不償失,因為內置的 sort()或 sorted() 方法已經足夠優秀了,且利用引數key可以實作不同的功能,非常靈活,二者的區別是sort()方法僅被定義在list中,而sorted()是全域方法對所有的可迭代序列都有效,
? Exp3:分別使用快排和sort()方法對同一串列排序,
測驗陣列:lists = [2,1,4,3,0],
- 方法一
def quick_sort(lists,i,j): if i >= j: return list pivot = lists[i] low = i high = j while i < j: while i < j and lists[j] >= pivot: j -= 1 lists[i]=lists[j] while i < j and lists[i] <=pivot: i += 1 lists[j]=lists[i] lists[j] = pivot quick_sort(lists,low,i-1) quick_sort(lists,i+1,high) return lists
- 方法二
lists.sort()
方法一耗時 2.4796975000000003s,方法二耗時 0.05551999999999424s,性能提升 97.76% ??
順帶一提,sorted()方法耗時 0.1339823999987857s,
可以看出,sort()作為list專屬的排序方法還是很強的,sorted()雖然比前者慢一點,但是勝在它“不挑食”,它對所有的可迭代序列都有效,
擴展:如何定義sort()或sorted()方法的key?
- 通過
lambda定義
#學生:(姓名,成績,年齡) students = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10)] students.sort(key = lambda student: student[0]) #根據姓名排序 sorted(students, key = lambda student: student[0])
- 通過
operator定義
import operator students = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10)] students.sort(key=operator.itemgetter(0)) sorted(students, key = operator.itemgetter(1, 0)) #先對成績排序,再對姓名排序
operator的itemgetter()適用于普通陣列排序,attrgetter()適用于物件陣列排序
- 通過
cmp_to_key()定義,最為靈活
import functools def cmp(a,b): if a[1] != b[1]: return -1 if a[1] < b[1] else 1 #先按照成績升序排序 elif a[0] != b[0]: return -1 if a[0] < b[0] else 1 #成績相同,按照姓名升序排序 else: return -1 if a[2] > b[2] else 1 #成績姓名都相同,按照年齡降序排序 students = [('john', 'A', 15),('john', 'A', 14),('jane', 'B', 12),('dave', 'B', 10)] sorted(students, key = functools.cmp_to_key(cmp))
4.使用collections.Counter()計數
? Exp4:統計字串中每個字符出現的次數,
測驗陣列:sentence='life is short, i choose python',
- 方法一
counts = {} for char in sentence: counts[char] = counts.get(char, 0) + 1
- 方法二
from collections import Counter Counter(sentence)
方法一耗時 2.8105250000000055s,方法二耗時 1.6317423000000062s,性能提升 41.94% ??
5.使用串列推導
串列推導(list comprehension)短小精悍,在小代碼片段中,可能沒有太大的區別,但是在大型開發中,它可以節省一些時間,
? Exp5:對串列中的奇數求平方,偶數不變,
測驗陣列:oldlist = range(10),
- 方法一
newlist = [] for x in oldlist: if x % 2 == 1: newlist.append(x**2)
- 方法二
[x**2 for x in oldlist if x%2 == 1]方法一耗時 1.5342976000000021s,方法二耗時 1.4181957999999923s,性能提升 7.57% ??
6.使用
join()連接字串大多數人都習慣使用
+來連接字串,但其實,這種方法非常低效,因為,+操作在每一步中都會創建一個新字串并復制舊字串,更好的方法是用join()來連接字串,關于字串的其他操作,也盡量使用內置函式,如isalpha()、isdigit()、startswith()、endswith()等,
? Exp6:將字串串列中的元素連接起來,
測驗陣列:oldlist = ['life', 'is', 'short', 'i', 'choose', 'python'],
- 方法一
sentence = "" for word in oldlist: sentence += word
- 方法二
"".join(oldlist)方法一耗時 0.27489080000000854s,方法二耗時 0.08166570000000206s,性能提升 70.29% ??
join還有一個非常舒服的點,就是它可以指定連接的分隔符,舉個例子??
oldlist = ['life', 'is', 'short', 'i', 'choose', 'python'] sentence = "//".join(oldlist) print(sentence)
life//is//short//i//choose//python
7.使用x, y = y, x交換變數
? Exp6:交換x,y的值,
- 方法一
temp = x x = y y = temp
- 方法二
x, y = y, x
方法一耗時 0.027853900000010867s,方法二耗時 0.02398730000000171s,性能提升 13.88% ??
8.使用while 1取代while True
在不知道確切的回圈次數時,常規方法是使用while True進行無限回圈,在代碼塊中判斷是否滿足回圈終止條件,雖然這樣做沒有任何問題,但while 1的執行速度比while True更快,因為它是一種數值轉換,可以更快地生成輸出,
? Exp8:分別用while 1和while True回圈 100 次,
- 方法一
i = 0 while True: i += 1 if i > 100: break
- 方法二
i = 0 while 1: i += 1 if i > 100: break
方法一耗時 3.679268300000004s,方法二耗時 3.607847499999991s,性能提升1.94% ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511017.html
標籤:其他
下一篇:離職了,要優雅地離開!
