国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

提高代碼效率的6個(gè)Python內(nèi)存優(yōu)化技巧

這篇具有很好參考價(jià)值的文章主要介紹了提高代碼效率的6個(gè)Python內(nèi)存優(yōu)化技巧。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

當(dāng)項(xiàng)目變得越來(lái)越大時(shí),有效地管理計(jì)算資源是一個(gè)不可避免的需求。Python與C或c++等低級(jí)語(yǔ)言相比,似乎不夠節(jié)省內(nèi)存。

但是其實(shí)有許多方法可以顯著優(yōu)化Python程序的內(nèi)存使用,這些方法可能在實(shí)際應(yīng)用中并沒(méi)有人注意,所以本文將重點(diǎn)介紹Python的內(nèi)置機(jī)制,掌握它們將大大提高Python編程技能。

提高代碼效率的6個(gè)Python內(nèi)存優(yōu)化技巧,python,開(kāi)發(fā)語(yǔ)言,機(jī)器學(xué)習(xí),內(nèi)存管理

首先在進(jìn)行內(nèi)存優(yōu)化之前,我們首先要查看內(nèi)存的使用情況

分配了多少內(nèi)存?

有幾種方法可以在Python中獲取對(duì)象的大小。可以使用sys.getsizeof()來(lái)獲取對(duì)象的確切大小,使用objgraph.show_refs()來(lái)可視化對(duì)象的結(jié)構(gòu),或者使用psutil.Process().memory_info()。RSS獲取當(dāng)前分配的所有內(nèi)存。

 >>> import numpy as np
 >>> import sys
 >>> import objgraph
 >>> import psutil
 >>> import pandas as pd
 
 
 >>> ob = np.ones((1024, 1024, 1024, 3), dtype=np.uint8)
 
 ### Check object 'ob' size
 >>> sys.getsizeof(ob) / (1024 * 1024)
 3072.0001373291016
 
 ### Check current memory usage of whole process (include ob and installed packages, ...)
 >>> psutil.Process().memory_info().rss / (1024 * 1024)
 3234.19140625
 
 ### Check structure of 'ob' (Useful for class object)
 >>> objgraph.show_refs([ob], filename='sample-graph.png')
 
 ### Check memory for pandas.DataFrame
 >>> from sklearn.datasets import load_boston
 >>> data = load_boston()
 >>> data = pd.DataFrame(data['data'])
 >>> print(data.info(verbose=False, memory_usage='deep'))
 <class 'pandas.core.frame.DataFrame'>
 RangeIndex: 506 entries, 0 to 505
 Columns: 13 entries, 0 to 12
 dtypes: float64(13)
 memory usage: 51.5 KB
   
 ### Check memory for pandas.Series
 >>> data[0].memory_usage(deep=True)   # deep=True to include all the memory used by underlying parts that construct the pd.Series
 4176

這樣我們才能根據(jù)對(duì)象的內(nèi)存占用來(lái)查看實(shí)際的優(yōu)化結(jié)果

slots

Python作為一種動(dòng)態(tài)類型語(yǔ)言,在面向?qū)ο蠓矫婢哂懈蟮撵`活性。在運(yùn)行時(shí)可以向Python類添加額外屬性和方法的能力。

例如,下面的代碼定義了一個(gè)名為Author的類。最初它有兩個(gè)屬性name和age。但是我們以后可以很容易地添加一個(gè)額外的job:

 class Author:
     def __init__(self, name, age):
         self.name = name
         self.age = age
 
 
 me = Author('Yang Zhou', 30)
 me.job = 'Software Engineer'
 print(me.job)
 # Software Engineer

但是這種靈活性在底層浪費(fèi)了更多內(nèi)存。

因?yàn)镻ython中每個(gè)類的實(shí)例都維護(hù)一個(gè)特殊的字典(dict)來(lái)存儲(chǔ)實(shí)例變量。因?yàn)樽值涞牡讓踊诠1淼膶?shí)現(xiàn)所以消耗了大量的內(nèi)存。

在大多數(shù)情況下,我們不需要在運(yùn)行時(shí)更改實(shí)例的變量或方法,并且__dict__不會(huì)(也不應(yīng)該)在類定義后更改。所以Python為此提供了一個(gè)屬性:slots。

它通過(guò)指定類的所有有效屬性的名稱來(lái)作為白名單:

 class Author:
     __slots__ = ('name', 'age')
 
     def __init__(self, name, age):
         self.name = name
         self.age = age
 
 
 me = Author('Yang Zhou', 30)
 me.job = 'Software Engineer'
 print(me.job)
 # AttributeError: 'Author' object has no attribute 'job'

白名單只定義了兩個(gè)有效的屬性name和age。由于屬性是固定的,Python不需要為它維護(hù)字典,只為_(kāi)_slots__中定義的屬性分配必要的內(nèi)存空間。

下面我們做一個(gè)簡(jiǎn)單的比較:

 import sys
 
 
 class Author:
     def __init__(self, name, age):
         self.name = name
         self.age = age
 
 
 class AuthorWithSlots:
     __slots__ = ['name', 'age']
 
     def __init__(self, name, age):
         self.name = name
         self.age = age
 
 
 # Creating instances
 me = Author('Yang', 30)
 me_with_slots = AuthorWithSlots('Yang', 30)
 
 # Comparing memory usage
 memory_without_slots = sys.getsizeof(me) + sys.getsizeof(me.__dict__)
 memory_with_slots = sys.getsizeof(me_with_slots)  # __slots__ classes don't have __dict__
 
 print(memory_without_slots, memory_with_slots)
 # 152 48
 print(me.__dict__)
 # {'name': 'Yang', 'age': 30}
 print(me_with_slots.__dict__)
 # AttributeError: 'AuthorWithSlots' object has no attribute '__dict__'

可以看到 152 和 48 明顯節(jié)省了內(nèi)存。

Generators

生成器是Python中列表的惰性求值版本。每當(dāng)調(diào)用next()方法時(shí)生成一個(gè)項(xiàng),而不是一次計(jì)算所有項(xiàng)。所以它們?cè)谔幚泶笮蛿?shù)據(jù)集時(shí)非常節(jié)省內(nèi)存。

 def number_generator():
     for i in range(100):
         yield i
 
 numbers = number_generator()
 print(numbers)
 # <generator object number_generator at 0x104a57e40>
 print(next(numbers))
 # 0
 print(next(numbers))
 # 1

上面的代碼顯示了一個(gè)編寫和使用生成器的基本示例。關(guān)鍵字yield是生成器定義的核心。應(yīng)用它意味著只有在調(diào)用next()方法時(shí)才會(huì)產(chǎn)生項(xiàng)i。

讓我們比較一個(gè)生成器和一個(gè)列表,看看哪個(gè)更節(jié)省內(nèi)存:

 mport sys
 
 numbers = []
 for i in range(100):
     numbers.append(i)
 
 def number_generator():
     for i in range(100):
         yield i
 
 numbers_generator = number_generator()
 print(sys.getsizeof(numbers_generator))
 # 112
 print(sys.getsizeof(numbers))
 # 920

可以看到使用生成器可以顯著節(jié)省內(nèi)存使用。如果我們將列表推導(dǎo)式的方括號(hào)轉(zhuǎn)換成圓括號(hào),它將成為生成器表達(dá)式。這是在Python中定義生成器的更簡(jiǎn)單的方法:

 import sys
 
 numbers = [i for i in range(100)]
 numbers_generator = (i for i in range(100))
 
 print(sys.getsizeof(numbers_generator))
 # 112
 print(sys.getsizeof(numbers))
 # 920

利用內(nèi)存映射文件支持大文件處理

內(nèi)存映射文件I/O,簡(jiǎn)稱“mmap”,是一種操作系統(tǒng)級(jí)優(yōu)化。

簡(jiǎn)單地說(shuō),當(dāng)使用mmap技術(shù)對(duì)文件進(jìn)行內(nèi)存映射時(shí),它直接在當(dāng)前進(jìn)程的虛擬內(nèi)存空間中創(chuàng)建文件的映射,而不是將整個(gè)文件加載到內(nèi)存中,這節(jié)省了大量?jī)?nèi)存。

Python已經(jīng)提供了用于使用此技術(shù)的內(nèi)置模塊,因此我們可以輕松地利用它,而無(wú)需考慮操作系統(tǒng)級(jí)別的實(shí)現(xiàn)。

以下是如何在Python中使用mmap進(jìn)行文件處理:

 import mmap
 
 
 with open('test.txt', "r+b") as f:
     # memory-map the file, size 0 means whole file
     with mmap.mmap(f.fileno(), 0) as mm:
         # read content via standard file methods
         print(mm.read())
         # read content via slice notation
         snippet = mm[0:10]
         print(snippet.decode('utf-8'))

Python使內(nèi)存映射文件I/O技術(shù)的使用變得方便。我們所需要做的只是應(yīng)用mmap.mmap()方法,然后使用標(biāo)準(zhǔn)文件方法甚至切片符號(hào)處理打開(kāi)的對(duì)象。

選擇適當(dāng)?shù)臄?shù)據(jù)類型

開(kāi)發(fā)人員應(yīng)仔細(xì)而精確地選擇數(shù)據(jù)類型。因?yàn)樵谀承┣闆r下,使用一種數(shù)據(jù)類型比使用另一種數(shù)據(jù)類型更節(jié)省內(nèi)存。

1、元組比列表更節(jié)省內(nèi)存

元組是不可變的(在創(chuàng)建后不能更改),它允許Python在內(nèi)存分配方面進(jìn)行優(yōu)化。列表是可變的,因此需要額外的空間來(lái)容納潛在的修改。

 import sys
 
 my_tuple = (1, 2, 3, 4, 5)
 my_list = [1, 2, 3, 4, 5]
 
 print(sys.getsizeof(my_tuple))
 # 80
 print(sys.getsizeof(my_list)) 
 # 120

元組my_tuple比列表使用更少的內(nèi)存,如果創(chuàng)建后不需要更改數(shù)據(jù),我們應(yīng)該選擇元組而不是列表。

2、數(shù)組比列表更節(jié)省內(nèi)存

Python中的數(shù)組要求元素具有相同的數(shù)據(jù)類型(例如,所有整數(shù)或所有浮點(diǎn)數(shù)),但列表可以存儲(chǔ)不同類型的對(duì)象,這不可避免地需要更多的內(nèi)存。如果列表的元素都是相同類型,使用數(shù)組會(huì)更節(jié)省內(nèi)存:

 import sys
 import array
 
 my_list = [i for i in range(1000)]
 
 my_array = array.array('i', [i for i in range(1000)])
 
 print(sys.getsizeof(my_list))  
 # 8856
 print(sys.getsizeof(my_array)) 
 # 4064

另外:Python是數(shù)據(jù)科學(xué)的主導(dǎo)語(yǔ)言。有許多強(qiáng)大的第三方模塊和工具提供更多的數(shù)據(jù)類型,如NumPy和Pandas。如果我們只需要一個(gè)簡(jiǎn)單的一維數(shù)字?jǐn)?shù)組,而不需要NumPy提供的廣泛功能,那么Python的內(nèi)置數(shù)組是一個(gè)不錯(cuò)的選擇。但當(dāng)涉及到復(fù)雜的矩陣操作時(shí),使用NumPy提供的數(shù)組是所有數(shù)據(jù)科學(xué)家的首選,也可能是最佳選擇。

字符串駐留

看看下面的代碼:

 >>> a = 'Y'*4096
 >>> b = 'Y'*4096
 >>> a is b
 True
 >>> c = 'Y'*4097
 >>> d = 'Y'*4097
 >>> c is d
 False

為什么a是b是真,而c是d是假呢?

這在Python中被稱作字符串駐留(string interning).如果有幾個(gè)值相同的小字符串,它們將被Python隱式地存儲(chǔ)并在內(nèi)存中并引用相同的對(duì)象。定義小字符串閾值數(shù)字是4096。

由于c和d的長(zhǎng)度為4097,因此它們是內(nèi)存中的兩個(gè)對(duì)象而不是一個(gè)對(duì)象,不再隱式駐留字符串。所以當(dāng)執(zhí)行c = d時(shí),我們得到一個(gè)False。

駐留是一種優(yōu)化內(nèi)存使用的強(qiáng)大技術(shù)。如果我們想要顯式地使用它可以使用sys.intern()方法:

 >>> import sys
 >>> c = sys.intern('Y'*4097)
 >>> d = sys.intern('Y'*4097)
 >>> c is d
 True

https://avoid.overfit.cn/post/67b82ca0447e4ebf9dac35fa820156b7

作者:Yang Zhou文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-799746.html

到了這里,關(guān)于提高代碼效率的6個(gè)Python內(nèi)存優(yōu)化技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 幾種技巧讓大模型(ChatGPT、文心一言)幫你提高寫代碼效率!

    幾種技巧讓大模型(ChatGPT、文心一言)幫你提高寫代碼效率!

    自從大模型推出來(lái)之后,似乎沒(méi)有什么工作是大模型不能做的。特別是在文本生成、文案寫作、代碼提示、代碼生成、代碼改錯(cuò)等方面都表現(xiàn)出不錯(cuò)的能力。下面我將介紹運(yùn)用大模型寫代碼的幾種方式,幫助程序員寫出更好的代碼!(大模型包括但不限于 ChatGPT、文心一言【

    2024年02月08日
    瀏覽(26)
  • 漲點(diǎn)技巧: 谷歌強(qiáng)勢(shì)推出優(yōu)化器Lion,引入到Y(jié)olov8,內(nèi)存更小、效率更高,秒殺Adam(W)

    漲點(diǎn)技巧: 谷歌強(qiáng)勢(shì)推出優(yōu)化器Lion,引入到Y(jié)olov8,內(nèi)存更小、效率更高,秒殺Adam(W)

    論文:https://arxiv.org/abs/2302.06675 代碼:automl/lion at master · google/automl · GitHub 1

    2023年04月18日
    瀏覽(26)
  • (實(shí)用)如何在vscode設(shè)置自己的代碼片段,提高開(kāi)發(fā)效率

    (實(shí)用)如何在vscode設(shè)置自己的代碼片段,提高開(kāi)發(fā)效率

    ?項(xiàng)目背景 很多時(shí)候,我們新建vue文件的時(shí),都需要把重復(fù)的代碼結(jié)構(gòu)重新輸入或者copy過(guò)來(lái),對(duì)開(kāi)發(fā)效率照成影響。?? 可以通過(guò)鍵入 vue3 快速生成代碼片段 構(gòu)建效果 操作步驟 在vscode左下角,點(diǎn)擊設(shè)置按鈕,選擇新建 用戶代碼片段 : 也可以在 文件 / 首選項(xiàng) / 配置用

    2024年04月09日
    瀏覽(19)
  • 大型企業(yè)如何通過(guò)低代碼平臺(tái)提高開(kāi)發(fā)效率和降低成本?

    大型企業(yè)如何通過(guò)低代碼平臺(tái)提高開(kāi)發(fā)效率和降低成本?

    云計(jì)算、大數(shù)據(jù)、人工智能、物聯(lián)網(wǎng)風(fēng)口之下,企業(yè)數(shù)字化轉(zhuǎn)型如同被按下了快進(jìn)鍵。為快速攻破轉(zhuǎn)型路上的技術(shù)關(guān),企業(yè)紛紛把目光投向了低代碼開(kāi)發(fā)平臺(tái),希望可以用最短的時(shí)間,開(kāi)發(fā)出最適合企業(yè)發(fā)展的應(yīng)用。 首先,我們要明確一個(gè)問(wèn)題,那就是對(duì)于集團(tuán)型企業(yè)來(lái)說(shuō),

    2024年02月06日
    瀏覽(28)
  • 助你加速開(kāi)發(fā)效率!告別IDEA卡頓困擾的性能優(yōu)化技巧

    助你加速開(kāi)發(fā)效率!告別IDEA卡頓困擾的性能優(yōu)化技巧

    在現(xiàn)代軟件開(kāi)發(fā)中,IDE(集成開(kāi)發(fā)環(huán)境)是一個(gè)必不可少的工具。IntelliJ IDEA是一個(gè)廣受歡迎的IDE,但有時(shí)候IDE的性能可能會(huì)受到影響,導(dǎo)致開(kāi)發(fā)人員的工作效率降低。本文將介紹一些可以提高IDE性能的技巧,幫助開(kāi)發(fā)人員消除卡頓困擾。 優(yōu)化IDE的配置 在IDEA中,可以通過(guò)修改

    2024年01月25日
    瀏覽(92)
  • chatgpt賦能python:Python動(dòng)態(tài)內(nèi)存分配:如何優(yōu)化你的代碼

    在編寫Python代碼時(shí),你可能已經(jīng)注意到內(nèi)存使用方面的一些問(wèn)題。Python動(dòng)態(tài)內(nèi)存分配是一個(gè)重要的話題,它涉及到Python程序如何在運(yùn)行時(shí)使用內(nèi)存。本文將向您介紹Python動(dòng)態(tài)內(nèi)存分配的基本概念和如何優(yōu)化您的代碼以節(jié)省內(nèi)存。 Python是一種解釋型語(yǔ)言,它在運(yùn)行時(shí)使用動(dòng)態(tài)內(nèi)

    2024年02月07日
    瀏覽(25)
  • 低代碼制造ERP管理系統(tǒng):降低開(kāi)發(fā)成本,提高生產(chǎn)效率

    低代碼制造ERP管理系統(tǒng):降低開(kāi)發(fā)成本,提高生產(chǎn)效率

    隨著制造業(yè)的快速發(fā)展,ERP管理系統(tǒng)成為了現(xiàn)代制造業(yè)中不可或缺的一部分。ERP管理系統(tǒng)可以幫助企業(yè)更好地管理生產(chǎn)流程、庫(kù)存和供應(yīng)鏈等方面,從而提高企業(yè)的生產(chǎn)效率和競(jìng)爭(zhēng)力。然而,傳統(tǒng)的ERP管理系統(tǒng)往往需要大量的編程工作和長(zhǎng)周期的開(kāi)發(fā)過(guò)程,這對(duì)于一些中小型

    2024年02月12日
    瀏覽(24)
  • 漲點(diǎn)技巧: 谷歌強(qiáng)勢(shì)推出優(yōu)化器Lion,引入到Y(jié)olov5/Yolov7,內(nèi)存更小、效率更高,秒殺Adam(W)

    漲點(diǎn)技巧: 谷歌強(qiáng)勢(shì)推出優(yōu)化器Lion,引入到Y(jié)olov5/Yolov7,內(nèi)存更小、效率更高,秒殺Adam(W)

    論文:https://arxiv.org/abs/2302.06675 代碼:automl/lion at master · google/automl · GitHub 1)與 AdamW 和各種自適應(yīng)優(yōu)化器需要同時(shí)保存一階和二階矩相比,Lion 只需要?jiǎng)恿?,將額外的內(nèi)存占用減半; 2)由于 Lion 的簡(jiǎn)單性,Lion 在我們的實(shí)驗(yàn)中具有更快的運(yùn)行時(shí)間(step/s),通常比 AdamW 和

    2024年02月16日
    瀏覽(37)
  • 低代碼開(kāi)發(fā):是提高效率的美味佳肴還是無(wú)法滿足深度需求的垃圾食品?

    低代碼開(kāi)發(fā):是提高效率的美味佳肴還是無(wú)法滿足深度需求的垃圾食品?

    有志者自有千計(jì)萬(wàn)計(jì),無(wú)志者只感千難萬(wàn)難。 隨著技術(shù)的不斷發(fā)展,軟件開(kāi)發(fā)方式也在不斷地演變。其中,低代碼開(kāi)發(fā)作為一種快速開(kāi)發(fā)的方式,受到了越來(lái)越多的關(guān)注。有人認(rèn)為低代碼開(kāi)發(fā)是美味的膳食,讓開(kāi)發(fā)變得高效而滿足,但也有人質(zhì)疑其缺乏定制性與深度,認(rèn)為其

    2024年02月05日
    瀏覽(19)
  • 提高C++運(yùn)行效率技巧

    在C++中,通過(guò)查表(Look-Up Table, LUT)來(lái)計(jì)算三角函數(shù)的數(shù)值是一種節(jié)省時(shí)間的方法,尤其是在需要快速計(jì)算且對(duì)精度要求不是特別高的情況下。這種方法通常用于嵌入式系統(tǒng)或?qū)崟r(shí)應(yīng)用,因?yàn)檫@些場(chǎng)景中對(duì)計(jì)算速度有較高要求,而硬件資源可能有限。 查表法的基本思想是預(yù)先

    2024年02月20日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包