日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python写内存挂_编写高效内存Python代码的3个技巧

發(fā)布時(shí)間:2023/12/15 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python写内存挂_编写高效内存Python代码的3个技巧 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

大多數(shù)時(shí)候,我們不需要優(yōu)化Python中的內(nèi)存使用情況。我們的程序太小而無法占用大量內(nèi)存,或者我們正在將數(shù)據(jù)存儲(chǔ)在程序外部的數(shù)據(jù)庫中。無論如何,在某些情況下,我們必須在內(nèi)存中保留過大的結(jié)構(gòu)或大量的對象。因此,我希望舉例說明可以減少程序內(nèi)存使用量的做法。

議程

用__slots__限制類字段

Generator惰性加載

用數(shù)組約束元素類型

用__slots__限制類字段

默認(rèn)情況下,每當(dāng)您在Python中創(chuàng)建對象時(shí),即使在創(chuàng)建之后,您也能夠?qū)⑿伦侄翁砑拥綄ο蟆?/p>

例如,假設(shè)我有一個(gè)名為Dog的類:

class?Dog:

def?__init__(self,?name,?age):

self.name?=?name

self.age?=?age

def?main():

dog?=?Dog("James",?5)

dog.breed?=?"Pitbull"

print(dog.breed)

main()

盡管名稱和年齡是我傳遞給構(gòu)造函數(shù)的唯一字段,但是請注意,在創(chuàng)建dog之后,如何初始化一個(gè)名為繁殖的新字段。本質(zhì)上,dog的字段存儲(chǔ)在內(nèi)部字典中,可通過.__ dict__訪問,并且在初始化dog.breed時(shí),將其值為“ Pitbull”的字段“ breed”添加到內(nèi)部字典中。

def?main():

dog?=?Dog("James",?5)

print(dog.__dict__)

'''

output:?{'name':?'James',?'age':?5}

'''

dog.breed?=?"Pitbull"

print(dog.__dict__)

'''

output:?{'name':?'James',?'age':?5,?'breed':?'Pitbull'}

'''

main()

盡管這提供了靈活性,但大多數(shù)時(shí)候我們不需要在實(shí)例化之外添加新字段。為了節(jié)省內(nèi)存占用量,我們可以設(shè)置Dog的__slots__屬性來預(yù)定義其字段。

class?Dog:

__slots__?=?("name",?"age")

def?__init__(self,?name,?age):

self.name?=?name

self.age?=?age

使用__slots__可以防止創(chuàng)建內(nèi)部字典,從而使我們可以更緊湊地存儲(chǔ)實(shí)例字段。但是,現(xiàn)在,我們不再能夠即時(shí)創(chuàng)建新字段。

def?main():

dog?=?Dog("James",?5)

dog.breed?=?"Pitbull"

'''

output:?AttributeError:'Dog'?object?has?no?attribute?'breed'

'''

main()

為了測試__slots__的內(nèi)存使用情況,我創(chuàng)建了100,000個(gè)Dog和SlotDog對象。

class?Dog:

def?__init__(self,?name,?age):

self.name?=?name

self.age?=?age

class?SlotDog:

__slots__=("name",?"age")

def?__init__(self,?name,?age):

self.name?=?name

self.age?=?age

然后,我使用memory_profiler分解了創(chuàng)建100,000個(gè)對象后內(nèi)存使用量的增加情況。創(chuàng)建Dog對象后,內(nèi)存使用量增加了16.5 MiB,而SlotDog對象則增加了5.8 MiB,這表明使用__slots__有了很大的改進(jìn)。您可以在GitHub上查看創(chuàng)建代碼(https://github.com/Ramko9999/Medium-Memory-Efficient-Python/blob/main/slots_perf.py)。

在必須實(shí)例化具有預(yù)定字段的大量對象的情況下,使用__slots__將是有益的。

用Genertor惰性加載

當(dāng)使用大文件或集合時(shí),可能無法加載整個(gè)文件或?qū)⒓暇S護(hù)在內(nèi)存中。如果我們可以一次處理多個(gè)文件或集合中的一個(gè)元素,那就太好了。

進(jìn)入生成器!

讓我們考慮一個(gè)例子。說我需要獲取前n個(gè)奇數(shù)進(jìn)行處理。自然地,我們可以創(chuàng)建一個(gè)列表并附加前n個(gè)奇數(shù)。

def?get_odds_list(n):

odds?=?[]

num?=?1

for?i?in?range(n):

odds.append(num)

num?+=?2

return?odds

但是,如果我們要處理前幾百萬的賠率,那么在內(nèi)存中維護(hù)此列表將變得昂貴。更好的方法是在我們計(jì)算賠率時(shí)利用生成器迭代賠率,而不是計(jì)算和存儲(chǔ)所有百萬賠率。

這是上面的函數(shù)作為生成器的樣子:

def?get_odds_generator(n):

num?=?1

for?i?in?range(n):

yield?num

num?+=?2

odds?=?get_odds_generator(1000000)

當(dāng)我們初始化賠率時(shí),尚未計(jì)算任何奇數(shù)。此刻的賠率只是一個(gè)迭代器,一個(gè)值序列。為了訪問迭代器中的元素,我們必須在迭代器上調(diào)用next。顧名思義,next返回序列中的下一個(gè)值。

神奇之處在于yield關(guān)鍵字:它使函數(shù)成為生成器。本質(zhì)上,當(dāng)按賠率調(diào)用next時(shí),生成器get_odds_generator將評估其代碼,直到達(dá)到y(tǒng)ield為止。然后,生成器將返回該值,并且其狀態(tài)將凍結(jié)。然后,再次調(diào)用next時(shí),生成器將從中斷狀態(tài)重新開始評估其代碼。

def?get_odds_generator(n):

num?=?1

for?i?in?range(n):

yield?num

num?+=?2

odds?=?get_odds_generator(1000000)

first?=?next(odds)

'''

first?=?1

Explanation:?num?is?1.?We?enter?the?for?loop?and?immediately?yield?num

'''

second?=?next(odds)

'''

second?=?3

Explanation:?num?is?1.?We?add?2?to?num,?so?its?now?3.

We?go?the?next?iteration?of?the?loop?and?yield?num

'''

third?=?next(odds)

'''

third?=?5

Explanation:?num?is?3.?We?add?2?to?num,?so?its?now?5.

We?go?to?the?next?iteration?of?the?loop?and?yield?num

'''

我們還可以按照以下方式瀏覽生成器生成的值。

odds?=?get_odds_generator(1000000)

for?odd?in?odds:

pass?//process?the?odd

我們可以使用生成器來計(jì)算賠率。因此,我們不需要任何額外的內(nèi)存來存儲(chǔ)賠率。

使用生成器的一個(gè)警告是,我們將無法獲取先前的元素或跳過元素的序列。如果您需要訪問以前的元素,則最好直接使用列表。

用數(shù)組約束元素類型

盡管許多人認(rèn)為列表在Python中是數(shù)組,但實(shí)際上存在一個(gè)單獨(dú)的數(shù)組模塊。列表和數(shù)組之間的核心區(qū)別在于,數(shù)組僅限于一種類型的元素。

我們可以使用多種類型的值在Python中創(chuàng)建列表。

lst?=?[1.0,?1,?{},?"hi"]

數(shù)組不是這種情況。我們必須使用類型代碼指定數(shù)組中元素的類型。類型代碼是代表數(shù)組類型的字符:“ i”代表整數(shù),“ b”代表字符,依此類推…

from?array?import?array

arr?=?array('i',?[])?#?create?an?array?of?integers

arr.append(4)?#?append?4?to?arr

arr.append('')?#?type?error:?integer?is?required?not?string

數(shù)組與列表有很多共同的方法,例如append和pop(文檔)。數(shù)組的主要優(yōu)點(diǎn)是它們更加緊湊。為了測試這一點(diǎn),我制作了一個(gè)包含一百萬個(gè)整數(shù)的列表和數(shù)組,發(fā)現(xiàn)該列表的內(nèi)存使用量增加了19.5 MiB,而數(shù)組僅增加了4 MiB。簽出測量代碼(代碼)。

如果您有大量相同類型的數(shù)據(jù)序列,請考慮使用數(shù)組。

結(jié)論

過早的優(yōu)化是萬惡之源。

-唐納德·埃文·克努斯

我已經(jīng)展示了可以減少內(nèi)存占用的多種實(shí)踐,從使用__slots__到數(shù)組不等。僅在真正需要優(yōu)化內(nèi)存的最壞情況下考慮使用這些做法。在大多數(shù)情況下,不需要__slots__和數(shù)組。另一方面,標(biāo)準(zhǔn)API很可能已經(jīng)使用了生成器,因此您可以放輕松。

【編輯推薦】

【責(zé)任編輯:華軒 TEL:(010)68476606】

點(diǎn)贊 0

總結(jié)

以上是生活随笔為你收集整理的python写内存挂_编写高效内存Python代码的3个技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 污视频网站免费看 | 成人av影视在线观看 | 精品乱码一区二区三区四区 | 国产精品国产一区 | 亚洲人成在线免费观看 | 久久免费的精品国产v∧ | 中文字幕在线观看网站 | 午夜精品视频在线 | 茄子视频懂你更多在线观看 | 日本丰满大乳奶做爰 | www.av在线视频 | 亚洲欧美精品久久 | 成人av不卡 | 日本性久久 | 超碰一区二区三区 | 日本系列第一页 | 中文字幕免费高清在线观看 | 制服av在线 | 中文字幕在线视频网站 | 快播av在线 | 男人女人拔萝卜视频 | 欧洲女性下面有没有毛发 | 黄色片地址 | 久草热在线观看 | 中文字幕日韩人妻在线视频 | 二区国产 | 日狠狠 | 欧美久久久久久久久久久久久久 | 欧美三级网 | 国产伦理片在线观看 | 欧美又粗又深又猛又爽啪啪九色 | 日本三级少妇 | www,五月天,com| 中国妇女做爰视频 | 打屁股无遮挡网站 | 亚洲欧美一二三区 | 国产一二三区av | 69福利视频 | 精品国产乱码久久久久久闺蜜 | 一本大道av伊人久久综合 | 国产成人无码精品久久二区三 | 亚洲精品国产美女 | 欧美鲁| 人妻av中文系列 | 伊人情人综合网 | 午夜免费片 | www.超碰在线观看 | 午夜小视频在线 | 国产成人精品久久二区二区91 | 91精品国产综合久久久久久久 | 亚洲综合无码一区二区 | 亚洲电影影音先锋 | 国产精品短视频 | 乱子伦一区二区 | 欧美成人动态图 | 91色噜噜| 成人精品视频一区二区三区尤物 | 久久午夜影视 | 免费在线看污 | 免费观看一级黄色片 | www日日日 | 免费黄色av网址 | 香港一级淫片免费放 | 狠狠干免费视频 | 国产精自产拍久久久久久蜜 | 久久久久久成人精品 | 国产一区二区影院 | 国产aⅴ片| xxx视频在线观看 | 久久九九免费 | 疯狂做爰的爽文多肉小说王爷 | 久热精品在线观看 | xxxx在线播放| 久久精品免费观看 | 欧美久久久久久久久久久 | 国产在线观看av | jizz免费| 中文不卡av| 校园春色欧美 | 亚洲天堂一二三 | 日本精品一区二区三区视频 | 香蕉视频网站在线观看 | 亚洲午夜精品久久久久久app | 国产第一福利影院 | 免费看91| 国产视频久久久久久 | 亚洲精品自拍视频 | 欧美性猛交乱大交 | 影音先锋成人资源网 | 欧美一级在线观看视频 | 九一在线观看免费高清视频 | 精品一区二区在线免费观看 | 免费观看av网址 | 性欢交69国产精品 | 在线国产毛片 | 91亚洲高清 | 99情趣网 | 国产91精品在线观看 | 伊人久久一区二区三区 |