07xx-IO文件讀寫(xiě)
讀取全部
f.read()
括號(hào)里填參表示讀取幾個(gè)字符
按行讀取到列表中,每行為一個(gè)元素
f.readlines()
同樣,括號(hào)里的參數(shù)決定讀取的行數(shù)(?
不加s就是只讀一行,括號(hào)參數(shù)決定哪一行(?
這些代碼一次讀取全部,量大了容易撐爆內(nèi)存
可以用for item in f來(lái)讀取,他是用迭代的方式來(lái)操作
python內(nèi)存管理機(jī)制
1. 引用技術(shù):每個(gè)數(shù)據(jù)記錄著被變量關(guān)聯(lián)的次數(shù)
當(dāng)為0時(shí),數(shù)據(jù)成為垃圾(被標(biāo)記清楚時(shí)才釋放)
缺點(diǎn):存在循環(huán)引用,垃圾數(shù)據(jù)占用內(nèi)存的情況
2. 標(biāo)記清除:全盤(pán)掃描內(nèi)存空間,檢測(cè)不再使用的數(shù)據(jù)
缺點(diǎn):速度很慢
3. 分代揮手:將內(nèi)存分為012(小中大)三代,
每次在0代創(chuàng)建數(shù)據(jù),
當(dāng)內(nèi)存告急時(shí)觸發(fā)標(biāo)記清楚,將有用的數(shù)據(jù)升代
這個(gè)不用你自個(gè)干,你能干的是調(diào)整這三代的大小,什么時(shí)候算告急
但是不建議你干,因?yàn)樗痉峙涞膬?nèi)存就合適,而且你要改需要你有很深的技術(shù)造詣
以及你可以做好優(yōu)化,從根本上減少內(nèi)存使用
比如for循環(huán),前幾個(gè)取出來(lái)的item雖然引用基數(shù)為0,但是垃圾確實(shí)產(chǎn)生了,會(huì)加快0代內(nèi)存的清除
減少垃圾產(chǎn)生,對(duì)象池
比如
name01 = 'xxx'
name02 = 'xxx'
id(name01) == id(name02)? True
創(chuàng)建變量的時(shí)候:如果對(duì)象池中沒(méi)有相同數(shù)據(jù)則開(kāi)辟空間存儲(chǔ);如果有則直接返回?cái)?shù)據(jù)地址
提高內(nèi)存利用率,浮點(diǎn)型,字符串型等等,包括元組,這些不可變數(shù)據(jù)才有對(duì)象池,比如列表等就沒(méi)有
python3.2之后元組才有的對(duì)象池,但是不具備對(duì)象池的你可以自己寫(xiě)
所以游戲中打AI,實(shí)際上是隱藏了美術(shù)模型,然后你去其他地方又打打的是同一撥人,只是模型弄過(guò)去數(shù)據(jù)更新下
要是每個(gè)都是單獨(dú)模型,那對(duì)設(shè)備的要求非常高,像游戲里的子彈啊,之類(lèi)的,都是對(duì)象池
但是還是該怎么用怎么用,python底層有優(yōu)化,比如print([]),這個(gè)本來(lái)應(yīng)該是沒(méi)有對(duì)象池的
但是如果你Id一些看看就會(huì)發(fā)現(xiàn)這個(gè)也創(chuàng)建了對(duì)象池,這些優(yōu)化在做底層的一些操作的時(shí)候很有可能會(huì)壞事
比如之前那個(gè)多線(xiàn)程的項(xiàng)目,就牽扯到了GIL鎖還是哪個(gè),優(yōu)化給干炸了
(順帶一提,那個(gè)是用海龜庫(kù)畫(huà)了個(gè)界面出來(lái),多線(xiàn)程一邊檢測(cè)光標(biāo)坐標(biāo)一邊繪制,優(yōu)化和工作量都很大,吃力不討好,不如PyQt)
# 這個(gè)應(yīng)該算是個(gè)"實(shí)時(shí)渲染"(