隨手筆記(一) ps: ubuntu python相關

1、現有字典d={‘a’:42,‘g’:32,‘i’:12,‘k’:33}請按字典中的value值進行排序?

sorted(d.items(),key=lambdax:x[1])

2、linux查看某個服務的端口

netstat -anp|grep servicename

3、linux關機指令

reboot 重啓

shutdown -r now 重啓

shutdown -h now 立即關機

shutdown -h 20:25 系統在今天的20:25關機

shutdown -h +10 再過10分鐘關機

init 0 關機

init 6 重啓

4、給定兩個列表,怎麼找出他們相同的元素和不同的元素?

list1=[1,2,3]

list2=[3,4,5]

set1=set(list1)

set2=set(list2)

print(set1&set2)
print(set1^set2)

5、請寫出一段Python代碼實現刪除一個list裏面的重複元素?

比較容易記憶的是用內置的set:

l1=['b','c','d','b','c','a','a']

l2=list(set(l1))

print(l2)

如果想要保持他們原來的排序:用list類的sort方法:

l1=['b','c','d','b','c','a','a']

l2=list(set(l1))

l2.sort(key=l1.index)

print(l2)

也可以這樣寫:

l1=['b','c','d','b','c','a','a']

l2=sorted(set(l1),key=l1.index)

print (l2)

也可以用遍歷:

l1=['b','c','d','b','c','a','a']
l2=[]
for i in l1:
    if not i in l2:
        l2.append(i)
print(l2)

6、打印的結果是什麼

def extendlist(val,l=[]):
    l.append(val)
    return l

list1 = extendlist(10)
list2 = extendlist(123,[])
list3 = extendlist('a')

print('list1=%s'%list1)
print('list2=%s'%list2)
print('list3=%s'%list3)
list1=[10, 'a']
list2=[123]
list3=[10, 'a']

注:新的默認列表只在函數被定義的那一刻創建一次。當extendList被沒有指定特定參數list調用時,這組list的值隨後將被使用。這是因爲帶有默認參數的表達式在函數被定義的時候被計算,不是在調用的時候被計算。

7、f1、f2、f3的執行效率

def f1(ln):
    l1 = sorted(ln)
    l2 = [i for i in l1 if i<0.5]
    return [i*i for i in l2]

def f2(ln):
    l1 = [i for i in ln if i<0.5]
    l2 = sorted(l1)
    return [i*i for i in l2]

def f3(ln):
    l1 = [i*i for i in ln]
    l2 = sorted(l1)
    return [i for i in l2 if i<(0.5*0.5)]

if __name__ == '__main__':
    import random
    import cProfile
    ln = [random.random() for i in range(100000)]
    cProfile.run('f1(ln)')
    cProfile.run('f2(ln)')
    cProfile.run('f3(ln)')

8、Python中類方法、類實例方法、靜態方法有何區別?

類方法:是類對象的方法,在定義時需要在上方使用“@classmethod”進行裝飾,形參爲cls,表示類對象,類對象和實例對象都可調用;

類實例方法:是類實例化對象的方法,只有實例對象可以調用,形參爲self,指代對象本身;

靜態方法:是一個任意函數,在其上方使用“@staticmethod”進行裝飾,可以用對象直接調用,靜態方法實際上跟該類沒有太大關係。

9、python的內存管理機制及優手段

引用計數,垃圾回收,內存池

引用計數:

引用計數是一種非常高效的內存管理手段,當一個Python對象被引用時其引用計數增加1,當其不再被一個變量引用時則計數減1.當引用計數等於0時對象被刪除。

垃圾回收:

1.引用計數

引用計數也是一種垃圾回收機制。而且也是一種最直觀最簡單的垃圾收集技術。當Python的某個對象的引用計數降爲0時,說明沒有任何引用指向該對象,該對象就成爲要被回收的垃圾了。比如某個新建對象,它被分配給某個引用,對象的引用計數變爲1。如果引用被刪除,對象的引用計數爲0,那麼該對象就可以被垃圾回收。不過如果出現循環引用的話,引用計數機制就不再起有效的作用了

2.標記清除

如果兩個對象的引用計數都爲1,但是僅僅存在它們之間的循環引用,那麼這兩個對象都是需要被回收的,也就是說,他們的引用計數雖然表現爲非0,但實際有用的引用計數爲0,所以現將循環引用摘掉,就會得出這兩個對象的有效計數。

3.分代回收

從前面標記-清除這樣的垃圾機制來看,這種垃圾收集機制所帶來的額外操作實際上與系統中總的內存塊的數量相關。當需要回收的內存塊越多,垃圾檢測帶來的額外操作就越多,而垃圾回收帶來額外操作就越少;反之,當需要回收的內存越少時,垃圾檢測就將比垃圾回收帶來更少的額外操作

舉個例子:當某些內存塊M經過了3次垃圾收集的清洗之後還存活時,我們就將內存塊M劃到一個集合A中去,而新分配的內存都劃分到集合B中去。當垃圾收集開始工作時,大多數情況都只對集合B進行垃圾回收,而對集合A進行垃圾回收要隔相當長一段時間後才進行,這就使得垃圾收集機制需要處理的內存少了,效率自然就提高了。在這個過程中,集合B中的某些內存塊由於存活時間長而會被轉移到集合A中,當然,集合A中實際上也存在一些垃圾,這些垃圾的回收會因爲這種分代的機制而被延遲。

內存池:

1.Python的內存機制呈現金字塔形狀,-1,-2層主要有操作系統進行操作;

2.第0層是C中的malloc,free等內存分配和釋放函數進行操作;

3.第1層和第2層是內存池,有Python的接口函數PyMem_Malloc函數實現,當對象小於256K時有該層直接分配內存;

4.第3層是最上層,也就是我們對Python對象的直接操作;

Python在運行期間會大量地執行malloc和free的操作,頻繁地在用戶態和核心態之間進行切換,這將嚴重影響Python的執行效率。爲了加速Python的執行效率,Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放。Python內部默認的小塊內存與大塊內存的分界點定在256個字節,當申請的內存小於256字節時,PyObject_Malloc會在內存池中申請內存;當申請的內存大於256字節時,PyObject_Malloc的行爲將蛻化爲malloc的行爲。當然,通過修改Python源代碼,我們可以改變這個默認值,從而改變Python的默認內存管理行爲。

優化手段(瞭解)

1.手動垃圾回收

2.調高垃圾回收閾值

3.避免循環引用

10、有這樣一段代碼,print(b)會輸出什麼,爲什麼?

a = 10
b = [a]
a =15
print(b)

結果是10,對於字符串、數字傳遞是相應的值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章