1 python 如何管理內(nèi)存
對(duì)象引用計(jì)數(shù)機(jī)制算利,垃圾回收機(jī)制,內(nèi)存池機(jī)制
一泳姐。對(duì)象引用機(jī)制
python內(nèi)部引用計(jì)數(shù)效拭,來(lái)保持追蹤內(nèi)存中的對(duì)象,所以對(duì)象都有引用計(jì)數(shù)胖秒。
引用計(jì)數(shù)增加的情況:(1缎患,一個(gè)對(duì)象分配一個(gè)新名稱。2阎肝,將其放入一個(gè)容器中<如列表挤渔,元組或字典>)
引用計(jì)數(shù)減少的情況:(1,使用del語(yǔ)句對(duì)對(duì)象別名顯示的銷毀风题。2蚂蕴,引用超出作用域或被重新賦值)
sys.getrefcount()函數(shù)可以獲得對(duì)象的當(dāng)前引用計(jì)數(shù)
多數(shù)情況下,引用計(jì)數(shù)比你猜測(cè)的要大得多俯邓。對(duì)于不可變數(shù)據(jù)(如數(shù)字和字符串)埋凯,解釋器會(huì)在程序的不同部分共享內(nèi)存斋射,以便節(jié)約內(nèi)存。
二 垃圾回收
1 當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)歸零時(shí),它將被垃圾收集機(jī)制處理掉 2 當(dāng)兩個(gè)對(duì)象a和b相互引用時(shí)欺旧,del語(yǔ)句可以減少a和b的引用計(jì)數(shù)澎嚣,并銷毀用于引用底層對(duì)象的名稱瓶摆。然而由于每個(gè)對(duì)象都包含一個(gè)對(duì)其他對(duì)象的應(yīng)用刊愚,因此引用計(jì)數(shù)不會(huì)歸零,對(duì)象不會(huì)銷毀吩抓。(從而導(dǎo)致內(nèi)存泄漏)為解決這一問題涉茧,解釋器會(huì)定期執(zhí)行一個(gè)循環(huán)檢測(cè)器,搜索不可訪問的對(duì)象的循環(huán)并刪除它們疹娶。
三 內(nèi)存機(jī)制
python伴栓、提供了對(duì)內(nèi)存的垃圾手機(jī)機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回操作系統(tǒng)
1 Pymalloc機(jī)制。為了加速python的執(zhí)行效率钳垮,python引入了一個(gè)內(nèi)存池機(jī)制惑淳,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放 2 python中所有小于256個(gè)字節(jié)的對(duì)象都使用pymalloc實(shí)現(xiàn)的分配機(jī)制,而大的對(duì)象則使用系統(tǒng)的malloc 3 對(duì)于python對(duì)象饺窿,如整數(shù)歧焦,浮點(diǎn)數(shù)和list,都有獨(dú)立的私有內(nèi)存池肚医。也就是你分配又釋放了大量的整數(shù)绢馍,用于緩存這些整數(shù)的內(nèi)存就不能在分配給浮點(diǎn)數(shù)
2 lambda函數(shù)
lambda通常在需要一個(gè)函數(shù)卻不想去命名一個(gè)函數(shù)的場(chǎng)合下使用,也就是指匿名函數(shù)
lambda函數(shù):首要用途是指點(diǎn)短小的回調(diào)函數(shù)
lambda[arg]:expression
例如 a = lambda x,y:x+y
3 tuple list轉(zhuǎn)換
tuple(list) list(tuple)
4 刪除list里的重復(fù)元素
使用set函數(shù) set(list)
5 sorted與sort
Python list內(nèi)置sort()方法用來(lái)排序肠套,也可以用python內(nèi)置的全局sorted()方法來(lái)對(duì)可迭代的序列排序生成新的序列舰涌。
sorted(iterable,key=None,reverse=False)舵稠,返回新的列表入宦,對(duì)所有可迭代的對(duì)象均有效
sort(key=None,reverse=False) 就地改變列表 ?reverse:True反序室琢;False 正序
例如
>>>sorted([1,3,2,4,5])
[1,2,3,4,5]
>>>a=[5,4,3,2,1]
>>>a.sort()
>>>a
[1,2,3,4,5] #若用list.sort()則list本身將被修改
>>>sorted("This is a test string from Andrew".split(), key=str.lower)? #加了key盈滴,忽略大小寫
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']?????????????????#key=len按照長(zhǎng)度進(jìn)行排序
>>>sorted("This is a test string from Andrew".split()) ???#未加key,默認(rèn)大寫在前病苗,小寫在后
['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
>>> student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),]
>>> sorted(student_tuples, key=lambda student: student[2])?? # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>>student_tuples.sort(key=lambda x: x[2])
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>>s=”Hello79351WorldMyNameIsMrFiona0352231964”
>>>''.join(sorted(s,key=lambda x: (x.isdigit(),x.isdigit() and int(x)%2==0,x.islower(),x.isupper(),x)))
'FHIMMNWaadeeilllmnooorrsy113335579902246'
大寫在前硫朦,小寫在后咬展,數(shù)字放在最后并且奇數(shù)在偶數(shù)之前
>>>s={‘a(chǎn)’:10,’t’:5,’c’:2,’b’:12}
>>>sorted(s,key=lambda x:x[0])
[‘a(chǎn)’,’b’,’c’,’t’]
>>>s=[]
一個(gè)學(xué)校瞒斩,有3個(gè)辦公室,現(xiàn)在有8位老師等待工位的分配祷舀,請(qǐng)編寫程序,完成隨機(jī)的分配
#encoding=utf-8importrandom
# 定義一個(gè)列表用來(lái)保存3個(gè)辦公室
offices = [[],[],[]]
# 定義一個(gè)列表用來(lái)存儲(chǔ)8位老師的名字
names = ['A','B','C','D','E','F','G','H']
i =0
for name in names:? ??
? ? ? index = random.randint(0,2)?
? ? ? offices[index].append(name)
i =1
for tempNames in offices:
? ? ? ?print('辦公室%d的人數(shù)為:%d'%(i,len(tempNames)))
? ? ? ?i+=1
? ? ? ?for name in tempNames:?
? ? ? ? ? ? ? print("%s"%name,end='')
? ? ? ? ? ? ? print("\n")?
? ? ? ? ? ? ? print("-"*20)
運(yùn)行結(jié)果如下: