日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

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

來源: 責(zé)編: 時間:2024-01-16 17:31:31 268觀看
導(dǎo)讀當(dāng)項目變得越來越大時,有效地管理計算資源是一個不可避免的需求。Python與C或c++等低級語言相比,似乎不夠節(jié)省內(nèi)存。但是其實有許多方法可以顯著優(yōu)化Python程序的內(nèi)存使用,這些方法可能在實際應(yīng)用中并沒有人注意,所以本文

當(dāng)項目變得越來越大時,有效地管理計算資源是一個不可避免的需求。Python與C或c++等低級語言相比,似乎不夠節(jié)省內(nèi)存。TsR28資訊網(wǎng)——每日最新資訊28at.com

但是其實有許多方法可以顯著優(yōu)化Python程序的內(nèi)存使用,這些方法可能在實際應(yīng)用中并沒有人注意,所以本文將重點介紹Python的內(nèi)置機制,掌握它們將大大提高Python編程技能。TsR28資訊網(wǎng)——每日最新資訊28at.com

TsR28資訊網(wǎng)——每日最新資訊28at.com

首先在進行內(nèi)存優(yōu)化之前,我們首先要查看內(nèi)存的使用情況TsR28資訊網(wǎng)——每日最新資訊28at.com

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

有幾種方法可以在Python中獲取對象的大小。可以使用sys.getsizeof()來獲取對象的確切大小,使用objgraph.show_refs()來可視化對象的結(jié)構(gòu),或者使用psutil.Process().memory_info()。RSS獲取當(dāng)前分配的所有內(nèi)存。TsR28資訊網(wǎng)——每日最新資訊28at.com

>>> 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ù)對象的內(nèi)存占用來查看實際的優(yōu)化結(jié)果TsR28資訊網(wǎng)——每日最新資訊28at.com

__slots__

Python作為一種動態(tài)類型語言,在面向?qū)ο蠓矫婢哂懈蟮撵`活性。在運行時可以向Python類添加額外屬性和方法的能力。TsR28資訊網(wǎng)——每日最新資訊28at.com

例如,下面的代碼定義了一個名為Author的類。最初它有兩個屬性name和age。但是我們以后可以很容易地添加一個額外的job:TsR28資訊網(wǎng)——每日最新資訊28at.com

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

但是這種靈活性在底層浪費了更多內(nèi)存。TsR28資訊網(wǎng)——每日最新資訊28at.com

因為Python中每個類的實例都維護一個特殊的字典(__dict__)來存儲實例變量。因為字典的底層基于哈希表的實現(xiàn)所以消耗了大量的內(nèi)存。TsR28資訊網(wǎng)——每日最新資訊28at.com

在大多數(shù)情況下,我們不需要在運行時更改實例的變量或方法,并且__dict__不會(也不應(yīng)該)在類定義后更改。所以Python為此提供了一個屬性:__slots__。TsR28資訊網(wǎng)——每日最新資訊28at.com

它通過指定類的所有有效屬性的名稱來作為白名單:TsR28資訊網(wǎng)——每日最新資訊28at.com

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'

白名單只定義了兩個有效的屬性name和age。由于屬性是固定的,Python不需要為它維護字典,只為__slots__中定義的屬性分配必要的內(nèi)存空間。TsR28資訊網(wǎng)——每日最新資訊28at.com

下面我們做一個簡單的比較:TsR28資訊網(wǎng)——每日最新資訊28at.com

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)存。TsR28資訊網(wǎng)——每日最新資訊28at.com

Generators

生成器是Python中列表的惰性求值版本。每當(dāng)調(diào)用next()方法時生成一個項,而不是一次計算所有項。所以它們在處理大型數(shù)據(jù)集時非常節(jié)省內(nèi)存。TsR28資訊網(wǎng)——每日最新資訊28at.com

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

上面的代碼顯示了一個編寫和使用生成器的基本示例。關(guān)鍵字yield是生成器定義的核心。應(yīng)用它意味著只有在調(diào)用next()方法時才會產(chǎn)生項i。TsR28資訊網(wǎng)——每日最新資訊28at.com

讓我們比較一個生成器和一個列表,看看哪個更節(jié)省內(nèi)存:TsR28資訊網(wǎng)——每日最新資訊28at.com

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)式的方括號轉(zhuǎn)換成圓括號,它將成為生成器表達式。這是在Python中定義生成器的更簡單的方法:TsR28資訊網(wǎng)——每日最新資訊28at.com

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,簡稱“mmap”,是一種操作系統(tǒng)級優(yōu)化。TsR28資訊網(wǎng)——每日最新資訊28at.com

簡單地說,當(dāng)使用mmap技術(shù)對文件進行內(nèi)存映射時,它直接在當(dāng)前進程的虛擬內(nèi)存空間中創(chuàng)建文件的映射,而不是將整個文件加載到內(nèi)存中,這節(jié)省了大量內(nèi)存。TsR28資訊網(wǎng)——每日最新資訊28at.com

Python已經(jīng)提供了用于使用此技術(shù)的內(nèi)置模塊,因此我們可以輕松地利用它,而無需考慮操作系統(tǒng)級別的實現(xiàn)。TsR28資訊網(wǎng)——每日最新資訊28at.com

以下是如何在Python中使用mmap進行文件處理:TsR28資訊網(wǎng)——每日最新資訊28at.com

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)文件方法甚至切片符號處理打開的對象。TsR28資訊網(wǎng)——每日最新資訊28at.com

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

開發(fā)人員應(yīng)仔細(xì)而精確地選擇數(shù)據(jù)類型。因為在某些情況下,使用一種數(shù)據(jù)類型比使用另一種數(shù)據(jù)類型更節(jié)省內(nèi)存。TsR28資訊網(wǎng)——每日最新資訊28at.com

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

元組是不可變的(在創(chuàng)建后不能更改),它允許Python在內(nèi)存分配方面進行優(yōu)化。列表是可變的,因此需要額外的空間來容納潛在的修改。TsR28資訊網(wǎng)——每日最新資訊28at.com

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)該選擇元組而不是列表。TsR28資訊網(wǎng)——每日最新資訊28at.com

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

Python中的數(shù)組要求元素具有相同的數(shù)據(jù)類型(例如,所有整數(shù)或所有浮點數(shù)),但列表可以存儲不同類型的對象,這不可避免地需要更多的內(nèi)存。如果列表的元素都是相同類型,使用數(shù)組會更節(jié)省內(nèi)存:TsR28資訊網(wǎng)——每日最新資訊28at.com

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)語言。有許多強大的第三方模塊和工具提供更多的數(shù)據(jù)類型,如NumPy和Pandas。如果我們只需要一個簡單的一維數(shù)字?jǐn)?shù)組,而不需要NumPy提供的廣泛功能,那么Python的內(nèi)置數(shù)組是一個不錯的選擇。但當(dāng)涉及到復(fù)雜的矩陣操作時,使用NumPy提供的數(shù)組是所有數(shù)據(jù)科學(xué)家的首選,也可能是最佳選擇。TsR28資訊網(wǎng)——每日最新資訊28at.com

字符串駐留

看看下面的代碼:TsR28資訊網(wǎng)——每日最新資訊28at.com

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

為什么a是b是真,而c是d是假呢?TsR28資訊網(wǎng)——每日最新資訊28at.com

這在Python中被稱作字符串駐留(string interning).如果有幾個值相同的小字符串,它們將被Python隱式地存儲并在內(nèi)存中并引用相同的對象。定義小字符串閾值數(shù)字是4096。TsR28資訊網(wǎng)——每日最新資訊28at.com

由于c和d的長度為4097,因此它們是內(nèi)存中的兩個對象而不是一個對象,不再隱式駐留字符串。所以當(dāng)執(zhí)行c = d時,我們得到一個False。TsR28資訊網(wǎng)——每日最新資訊28at.com

駐留是一種優(yōu)化內(nèi)存使用的強大技術(shù)。如果我們想要顯式地使用它可以使用sys.intern()方法:TsR28資訊網(wǎng)——每日最新資訊28at.com

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

本文鏈接:http://m.www897cc.com/showinfo-26-62787-0.html提高代碼效率的六個Python內(nèi)存優(yōu)化技巧

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深入剖析PyPy,解鎖Python比C還快的秘訣

下一篇: 花 15 分鐘把 Express.js 搞明白,全棧沒有那么難

標(biāo)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产日产亚洲精品系列| 正在播放欧美一区| 欧美日韩一视频区二区| 久久在线免费观看| 欧美日韩亚洲天堂| 欧美电影在线免费观看网站| 另类春色校园亚洲| 欧美成人精品一区| 欧美精选午夜久久久乱码6080| 欧美日本在线| 国产精品网站在线播放| 国产综合在线视频| 日韩视频精品| 欧美一区在线视频| 久久一区二区三区国产精品| 奶水喷射视频一区| 欧美成人国产一区二区| 欧美jizz19性欧美| 欧美精品九九99久久| 国产麻豆精品在线观看| 亚洲福利视频一区二区| 在线一区亚洲| 欧美mv日韩mv亚洲| 国产午夜亚洲精品羞羞网站 | 久久综合国产精品台湾中文娱乐网| 久久久久国产精品麻豆ai换脸| 欧美国产精品日韩| 国产午夜精品在线观看| 一级成人国产| 老巨人导航500精品| 国产精品家庭影院| 91久久亚洲| 欧美国产日韩免费| 欧美精品尤物在线| 亚洲裸体俱乐部裸体舞表演av| 亚洲一区二区高清视频| 老巨人导航500精品| 久久久久久一区二区| 亚欧美中日韩视频| 欧美激情视频网站| 永久免费视频成人| 羞羞漫画18久久大片| 国产精品久久99| 亚洲欧洲精品一区| 久久午夜国产精品| 狠狠综合久久| 欧美亚洲日本国产| 国产精品视频1区| 中日韩高清电影网| 国产精品久久久99| 亚洲一线二线三线久久久| 国产精品福利在线观看| 亚洲影院色无极综合| 国产精品美女999| 亚洲午夜免费视频| 欧美日韩一区二区三区| 日韩视频久久| 欧美日韩亚洲一区在线观看| 日韩写真视频在线观看| 欧美日韩一区不卡| 亚洲一区欧美激情| 国产日韩精品一区二区三区 | 国产精品久久久久久久久借妻 | 欧美性大战久久久久| 99精品视频免费在线观看| 免费成人黄色| 亚洲精品乱码久久久久久黑人| 欧美精品二区| 亚洲永久网站| 国产婷婷色一区二区三区在线| 久久精品国产精品亚洲精品| 在线精品福利| 欧美欧美在线| 亚洲综合色丁香婷婷六月图片| 国产伦精品一区| 麻豆国产va免费精品高清在线| 亚洲国产成人精品女人久久久| 亚洲国产经典视频| 欧美午夜精品久久久久久浪潮| 一区二区三区欧美亚洲| 国产视频综合在线| 欧美日韩成人在线视频| 久久久精品一品道一区| 中文在线一区| 亚洲精品免费一二三区| 国产一区二区三区视频在线观看| 欧美精品一区二区三区久久久竹菊| 欧美亚洲在线播放| 中文有码久久| 亚洲久久视频| 亚洲国产激情| 影音先锋久久资源网| 国产日韩精品一区二区三区在线 | 亚洲一区免费观看| 99日韩精品| 亚洲国产精品一区制服丝袜| 国产精品一级在线| 国产精品久久久一区二区| 欧美精品在线免费播放| 久久精品一区二区三区不卡牛牛| 亚洲综合视频网| 亚洲在线中文字幕| 99热免费精品| 一区二区日韩欧美| 亚洲精品三级| 99亚洲一区二区| 一本大道久久a久久精品综合| 亚洲精品社区| 一本色道久久加勒比88综合| 99精品国产99久久久久久福利| 亚洲精品一区二区网址| 亚洲精品乱码久久久久久蜜桃麻豆| 久久精品毛片| 久久精品国产成人| 另类激情亚洲| 欧美激情成人在线| 欧美日韩在线免费观看| 国产精品伦子伦免费视频| 国产精品免费福利| 国产一区二区三区久久精品| 国户精品久久久久久久久久久不卡 | 久久综合久色欧美综合狠狠| 欧美刺激性大交免费视频| 欧美人妖在线观看| 国产精品制服诱惑| 一区二区三区在线免费视频| 亚洲黄色影片| 亚洲在线观看视频网站| 久久久久久久999精品视频| 免费毛片一区二区三区久久久| 欧美日韩成人综合天天影院| 国产精品久久久久毛片大屁完整版 | 裸体素人女欧美日韩| 欧美日韩精品综合| 国产伦精品一区二区三区视频黑人| 一区二区三区自拍| 亚洲图片在线观看| 狼人社综合社区| 国产精品美女久久久免费| 极品裸体白嫩激情啪啪国产精品| 99视频一区| 猛男gaygay欧美视频| 国产丝袜一区二区三区| 中文日韩电影网站| 麻豆精品在线播放| 国产精品一区久久久| 亚洲精品欧美日韩| 国产精品成人国产乱一区| 国语自产精品视频在线看8查询8| 一区二区三区日韩| 欧美国产成人精品| 狠狠色狠狠色综合人人| 亚洲在线观看视频网站| 亚洲亚洲精品在线观看| 亚洲欧美日韩精品在线| 欧美国产精品va在线观看| 欧美大片一区二区| 国产精品国产馆在线真实露脸| 久久久蜜桃一区二区人| 亚洲一区二区三区视频播放| 香蕉国产精品偷在线观看不卡| 在线一区日本视频| 先锋影音久久久| 欧美国产视频在线| 美国成人直播| 免费在线视频一区| 久久天天躁狠狠躁夜夜爽蜜月| 美女福利精品视频| 午夜伦理片一区| 久久久久久久综合狠狠综合| 嫩草影视亚洲| 欧美亚洲不卡| 最近中文字幕mv在线一区二区三区四区 | 一区二区三区国产| 亚洲高清视频在线观看| 欧美日韩国产高清视频| 一区二区亚洲精品国产| 一区二区亚洲精品| 亚洲综合国产激情另类一区| 在线观看视频日韩| 亚洲手机视频| 欧美成人午夜77777| 欧美日韩成人综合| 亚洲免费中文| 午夜欧美电影在线观看| 欧美区亚洲区| 国产视频欧美| 一区二区冒白浆视频| 性久久久久久| 久久三级福利| 激情欧美日韩一区| 欧美一级专区免费大片| 欧美日韩免费精品| 99亚洲一区二区| 欧美一区二区观看视频| 欧美日韩国产综合视频在线观看 | 亚洲激情在线激情| 精品99一区二区| 久久夜色精品亚洲噜噜国产mv| 国产精品久久久久婷婷| 午夜一区二区三区不卡视频| ●精品国产综合乱码久久久久| 亚洲天堂免费观看| 国产主播精品在线|