国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Python內(nèi)存分配,常駐內(nèi)存和測(cè)量

開發(fā) 后端
對(duì)于動(dòng)態(tài)語(yǔ)言,比如Python,內(nèi)存在語(yǔ)言層自動(dòng)管理,所以程序員無需關(guān)注太多細(xì)節(jié),但是如果要想自己寫的代碼高效可靠,則也必須了解語(yǔ)言的內(nèi)存機(jī)制。本文給大家介紹Python語(yǔ)言的內(nèi)存機(jī)制,以及如何對(duì)其內(nèi)存進(jìn)行度量。

要精通一門語(yǔ)言,熟悉其內(nèi)容分配和使用機(jī)制很重要。對(duì)于編譯型語(yǔ)言比如C,C++,內(nèi)存的使用完全由程序員自己代碼分配和管理,所以對(duì)C,C++程序員內(nèi)存機(jī)制非常熟悉。但是對(duì)于動(dòng)態(tài)語(yǔ)言,比如Python,內(nèi)存在語(yǔ)言層自動(dòng)管理,所以程序員無需關(guān)注太多細(xì)節(jié),但是如果要想自己寫的代碼高效可靠,則也必須了解語(yǔ)言的內(nèi)存機(jī)制。本文蟲蟲給大家介紹Python語(yǔ)言的內(nèi)存機(jī)制,以及如何對(duì)其內(nèi)存進(jìn)行度量。

概述

考慮以下代碼:

  1. import numpy as np 
  2. ccnp.ones((1024, 1024, 1024, 3), dtype=np.uint8) 

該代碼將會(huì)創(chuàng)建一個(gè)3GB字節(jié)的數(shù)組,并且都用1來填充。同學(xué)們,可能會(huì)這樣預(yù)想運(yùn)行該代碼后,進(jìn)程將會(huì)自動(dòng)分配3GB的內(nèi)存用來使用,事實(shí)是不是如此呢?

測(cè)量?jī)?nèi)存的一種方法是使用“常駐內(nèi)存”,在Python中可以使用psutil庫(kù)工具獲取方便的這些信息,檢查當(dāng)前進(jìn)程的常駐內(nèi)存:

  1. import psutil 
  2. psutil.Process().memory_info().rss /(1024 * 1024) 
  3. 3093 

在該示例中,進(jìn)程使用了3093MB或3.09GB,與數(shù)組大小的無區(qū)別,和預(yù)想的一樣。

但是常駐內(nèi)存實(shí)際上沒那么簡(jiǎn)單。假設(shè)在機(jī)器上運(yùn)行一些耗內(nèi)存的任務(wù)。然后切換回解釋器,再次運(yùn)行完全相同的命令:

  1. psutil.Process().memory_info().rss / (1024 * 1024) 
  2. 2903.12109375 

這是怎么回事? 內(nèi)存少了200MB。

為了解釋這個(gè)現(xiàn)象,需要了解操作系統(tǒng)如何內(nèi)存管理機(jī)制。

簡(jiǎn)化模型

當(dāng)前正運(yùn)行的程序都會(huì)分配一些內(nèi)存,即從操作系統(tǒng)取回虛擬內(nèi)存中的地址。 虛擬內(nèi)存是一個(gè)特定于進(jìn)程的地址空間,本質(zhì)上是來自0至264-1,進(jìn)程可以讀取或?qū)懭胱止?jié)。

在C語(yǔ)言中,程序員可以使用malloc()或者mmap()函數(shù)進(jìn)行手動(dòng)內(nèi)存分配;而在Python中,我們只需創(chuàng)建對(duì)象,Python 解釋器將在底層自動(dòng)調(diào)用malloc()或者mmap()。然后該進(jìn)程可以讀取或?qū)懭朐撎囟ǖ刂泛瓦B續(xù)字節(jié)。

Linux下可以用ltrace工具跟蹤調(diào)用malloc(),運(yùn)行下面Python代碼:

  1. import numpy as np 
  2. cc = np.ones((170_000,), dtype=np.uint8) 

然后可以運(yùn)行l(wèi)trace:

  1. ltrace -e malloc python ones.py 
  2. ... 
  3. _multiarray_umath.cpython-39-x86_64-linux-gnu.so->malloc(170000) = 0x5638862a45e0 
  4. ... 

整個(gè)過程Python 創(chuàng)建一個(gè)NumPy數(shù)組。

在Python引擎NumPy調(diào)用malloc()。

這樣做的結(jié)果malloc()是內(nèi)存中的地址:0x5638862a45e0。

然后,用于實(shí)現(xiàn)NumPy的C代碼可以讀取和寫入該地址和下一個(gè)連續(xù)的169,999 個(gè)地址,每個(gè)地址代表虛擬內(nèi)存中的一個(gè)字節(jié)。

這 170,000個(gè)字節(jié)存儲(chǔ)在哪里?

它們可以存儲(chǔ)在RAM中;這是默認(rèn)設(shè)置。

它們可以存儲(chǔ)在計(jì)算機(jī)的硬盤驅(qū)動(dòng)器或磁盤上,即swap分區(qū)交換中。

一些字節(jié)可能存儲(chǔ)在 RAM 中,一些字節(jié)可能存儲(chǔ)在交換分區(qū)中。

常駐內(nèi)存

RAM很快,而硬盤IO很慢,但RAM很貴。通常電腦硬盤驅(qū)動(dòng)器空間比RAM多得多。例如,目前主流的計(jì)算機(jī)都會(huì)有2T左右的硬盤存儲(chǔ)空間,但只會(huì)16GB的RAM。

理想情況下,程序的所有內(nèi)存都將存儲(chǔ)在內(nèi)存RAM中,但計(jì)算機(jī)上運(yùn)行的各種進(jìn)程可能分配的內(nèi)存比RAM中可用的內(nèi)存多。如果發(fā)生這種情況,操作系統(tǒng)會(huì)將一些數(shù)據(jù)從RAM移動(dòng)或“交換”到硬盤驅(qū)動(dòng)器。必要時(shí),從交換分區(qū)中獲取數(shù)據(jù),并將未積極使用的數(shù)據(jù)置換進(jìn)去。

現(xiàn)在我們準(zhǔn)備定義我們的第一個(gè)內(nèi)存使用量度:常駐內(nèi)存。常駐內(nèi)存是進(jìn)程分配的內(nèi)存中有多少常駐或存儲(chǔ)在RAM中。

在第一個(gè)示例中,首先將所有3GB的已分配數(shù)組存儲(chǔ)在RAM中。

然后,當(dāng)運(yùn)行一些任務(wù)時(shí),加載這些任務(wù)需要分配很多RAM,因此操作系統(tǒng)會(huì)將一些數(shù)據(jù)從RAM交換到磁盤交換分區(qū)。結(jié)果,Python進(jìn)程的常駐內(nèi)存下降了:所有數(shù)據(jù)仍然可以訪問,但其中一些已移至磁盤交換分區(qū)。

分配內(nèi)存

測(cè)量分配內(nèi)存會(huì)很有用,無論操作系統(tǒng)是將數(shù)據(jù)放在RAM中還是將其交換到磁盤,總是3GB內(nèi)存,程序?qū)嶋H需要多少內(nèi)存。

在 Python 中(如果使用的是Linux 或macOS),可以使用Fil memory profiler測(cè)量分配的內(nèi)存,它專門測(cè)量峰值分配的內(nèi)存。對(duì)于之前的示例:

常駐內(nèi)存和分配內(nèi)存之間的權(quán)衡

常駐內(nèi)存存在一些問題:

  • 內(nèi)存的使用和測(cè)量會(huì)受到其他進(jìn)程的影響,由于其他進(jìn)程可能會(huì)爭(zhēng)搶常駐內(nèi)存導(dǎo)致使用的實(shí)際使用的RAM會(huì)變化。
  • 常駐內(nèi)存的上限是可用的物理RAM,所以一旦達(dá)到上限,就永遠(yuǎn)不會(huì)真正了解程序要求多少內(nèi)存。比如主機(jī)物理內(nèi)存16GB,對(duì)需要17GB內(nèi)存的程序和需要30GB 內(nèi)存的程序,它們駐留內(nèi)存的量都將一致,都將是16GB。
  • 另一方面,分配的內(nèi)存不受其他進(jìn)程的影響,并告訴程序?qū)嶋H請(qǐng)求的內(nèi)容。

當(dāng)然,常駐內(nèi)存確實(shí)比分配內(nèi)存的優(yōu)勢(shì):

  • 交換的內(nèi)存很可能永遠(yuǎn)不會(huì)被使用:想象一下創(chuàng)建一個(gè)數(shù)組,忘記刪除引用,然后在程序的其余部分不再實(shí)際使用它。
  • 更廣泛地說,由于駐留內(nèi)存從操作系統(tǒng)的角度衡量實(shí)際使用的內(nèi)存,因此它可以捕獲對(duì)分配的內(nèi)存跟蹤不可見的邊緣情況。

讓我們看一個(gè)這樣的邊緣情況的例子。

總結(jié)

到目前為止示例中,我們一直在分配充滿1的數(shù)組。如果測(cè)量已分配的內(nèi)存,則數(shù)組填充的內(nèi)容沒有區(qū)別:可以切換到創(chuàng)建充滿零的數(shù)組,并且仍然得到完全相同的結(jié)果。

但是在Linux 上,再看一個(gè)例子:

  1. import numpy as np 
  2. import psutil 
  3. arr = np.zeros((1024, 1024, 1024, 3), dtype=np.uint8) 
  4. psutil.Process().memory_info().rss/(1024 * 1024) 
  5. 28.5546875 

這次,還是分配了一個(gè)3GB的數(shù)組,但是給數(shù)組的元素都是零。然后測(cè)量常駐內(nèi)存——數(shù)組并沒有被計(jì)算到,常駐內(nèi)存只有29M。數(shù)組占用的內(nèi)存呢?

事實(shí)證明,Linux 不會(huì)費(fèi)心將所有這些零存儲(chǔ)在RAM中。而只是在實(shí)際訪問數(shù)據(jù)時(shí)向RAM添加零塊,并不會(huì)實(shí)際分配內(nèi)存。

最后,需要提及的是,我們?cè)谡f的內(nèi)存使用模型也是理想狀態(tài)的。還沒有包括文件緩存、分配器中的內(nèi)存碎片或其他可用指標(biāo)等。

話雖如此,對(duì)于許多應(yīng)用程序來說,分配的內(nèi)存可能足以作為幫助優(yōu)化程序內(nèi)存使用的必要措施。

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2023-10-18 13:31:00

Linux內(nèi)存

2013-10-12 11:15:09

Linux運(yùn)維內(nèi)存管理

2013-10-12 13:01:51

Linux運(yùn)維內(nèi)存管理

2022-01-07 15:10:53

C++動(dòng)態(tài)內(nèi)存

2023-01-10 09:18:37

Go內(nèi)存分配逃逸

2010-09-25 14:12:50

Java內(nèi)存分配

2025-07-01 02:25:00

2022-03-07 10:54:34

內(nèi)存Linux

2021-02-28 13:22:54

Java內(nèi)存代碼

2025-09-23 10:08:18

2019-09-10 16:25:19

Python內(nèi)存空對(duì)象

2022-03-16 08:39:19

StackHeap內(nèi)存

2009-06-03 15:52:34

堆內(nèi)存棧內(nèi)存Java內(nèi)存分配

2025-08-05 09:24:30

2025-06-09 04:00:00

2023-01-28 08:32:04

Go內(nèi)存分配

2022-01-13 10:30:21

C語(yǔ)言內(nèi)存動(dòng)態(tài)

2018-02-08 14:57:22

對(duì)象內(nèi)存分配

2021-12-16 06:52:33

C語(yǔ)言內(nèi)存分配

2011-07-15 01:10:13

C++內(nèi)存分配
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

午夜电影久久久| 日本不卡一区二区三区视频| 精品视频免费在线观看| 国产肉体ⅹxxx137大胆| 在线亚洲高清视频| 免费高清视频在线一区| 国产噜噜噜噜噜久久久久久久久| 国产一区二区影院| 99热在线免费| 美女av一区二区| 成人激情午夜影院| 日韩精选视频| 色综合视频二区偷拍在线| 午夜在线电影亚洲一区| 欧美一级三级| 亚洲欧美另类动漫| 亚洲男人的天堂在线播放| 亚洲日产国产精品| 手机看片福利在线观看| 国产精品电影观看| 亚瑟在线精品视频| 亚洲精品888| 搞黄视频在线观看| 亚洲一区二区三区乱码aⅴ| 亚洲少妇最新在线视频| 国产激情视频在线看| 亚洲视频在线二区| 第一福利永久视频精品| 日韩精品诱惑一区?区三区| 黄色三级电影网站| 日本成人激情视频| 亚洲精品免费看| 91精品久久久久久久蜜月| 川上优的av在线一区二区| 狠狠色狠狠色综合人人| 91精品在线观看入口| 国产在线精品一区二区不卡了| 国产激情在线播放| 青青视频在线播放| 国产精品久久77777| 欧美日韩三级在线| 免费xxxx性欧美18vr| 精品国模一区二区三区| 男人和女人啪啪网站| 亚洲色图50p| 蜜桃一区二区三区在线观看| 91大神影片| 在线精品亚洲一区二区不卡| 亚洲精品一二三**| 国产精华一区二区三区| 亚洲自拍偷拍网站| 小草在线视频免费播放| 18成人在线| 日韩欧美卡一卡二| 亚洲高清二区| 中文字幕电影在线观看| 成人av网页| 欧美婷婷久久五月精品三区| 伊人精品影院| 亚洲我射av| 日本免费久久| 亚洲免费av一区二区三区| 一本一道久久a久久精品| 国产一区二区主播在线| 特色特色大片在线| 欧美综合色免费| 欧美精品一区二区久久| 日韩av片网站| 国产精品成av人在线视午夜片| 91视频91自| 国产一二区在线| 91亚洲精品久久久| 欧美激情一区二区在线| 国模视频一区| 可以在线看的黄色网址| 欧美激情亚洲激情| 久久久亚洲高清| 欧美美女在线直播| 久久免费电影| 好吊的妞视频这里都有| 欧美日韩亚洲一区二区三区在线观看 | 久久久女女女女999久久| 亚洲另类一区二区| 成人精品视频网站| 国产字幕视频一区二区| 综合伊思人在钱三区| 欧美xxxx在线| 亚洲中字在线| 欧美专区视频| 91精品国产综合久久久久久豆腐| 欧美性久久久久| 自拍偷拍一区二区三区四区| 无遮挡又爽又刺激的视频| 久久久精品有限公司| 欧美大尺度激情区在线播放| 91精品国产91热久久久做人人| 中文字幕亚洲情99在线| 国产精品老女人精品视频| 麻豆久久久9性大片| 久久精品欧美| 欧美尺度大的性做爰视频| 日韩一级免费一区| 亚洲国产岛国毛片在线| 久久激情五月婷婷| 亚洲欧美不卡| 亚洲作爱视频| 亚洲精品欧洲| 97久久夜色精品国产| 欧美区一区二区| av在线官网| 中文字幕在线高清| 91成人app| 奇米狠狠一区二区三区| 岳的好大精品一区二区三区| 超碰在线成人| 欧美天天综合| 免费在线日韩av| 国产亚洲综合av| 亚洲成av人**亚洲成av**| 欧美一区三区二区| 久久久久久久亚洲精品| 国产精品久久77777| 国产九区一区在线| 日本a在线天堂| 美女激情网站| 欧美美女搞黄| 亚洲综合图片| 精品国产亚洲日本| 国产精品久久久久久久久久妞妞| 91在线国产观看| 欧美高清精品3d| 国产情人节一区| 国产又大又黄又粗的视频| free性欧美hd另类精品| 欧美精选一区二区三区| 成人亚洲一区二区一| 欧美精品自拍偷拍动漫精品| 91精品成人久久| 日韩av在线综合| 两个人看的在线视频www| 国产情侣久久| 欧美日韩一区二区三区在线看| 日本久久久久亚洲中字幕| 黄页网站大全在线观看| 激情影院在线| 久久激情一区| 色网站国产精品| 主播大秀视频在线观看一区二区| 99久久夜色精品国产亚洲1000部| 国产精品久久久久7777按摩| 亚洲人a成www在线影院| 亚洲精品美女久久7777777| 免费在线看黄| 日本午夜精品视频在线观看 | 免费一级欧美片在线观看网站| 亚洲影音一区| 精品sm捆绑视频| 欧美视频在线观看视频| 欧美不卡高清一区二区三区| 粉嫩欧美一区二区三区高清影视| 亚洲欧美激情在线视频| 亚洲人成人77777线观看| 秋霞国产精品| 国产精品久久毛片| 97视频资源在线观看| 久久免费电影| 中文字幕乱码亚洲精品一区| 成人性生交xxxxx网站| 里番在线观看网站| www.欧美亚洲| 97视频资源在线观看| 日本免费久久| 一区二区在线观看av| 久久综合色一本| 国产精品一区免费在线| 午夜视频一区二区三区| 欧美日韩在线一二三| 日韩五码电影| 色婷婷精品久久二区二区蜜臂av | 精品久久国产精品| 女人和拘做爰正片视频| 欧美日韩在线观看视频小说| 欧美中文字幕不卡| 欧美日韩激情四射| av成人在线播放| 亚洲天堂精品在线观看| 2019精品视频| 在线观看a视频| 91女神在线视频| 久久草视频在线看| 精品一区二区三区中文字幕视频| 欧美日韩亚洲国产一区| 伊人网在线免费| 欧美+亚洲+精品+三区| 欧美不卡视频一区发布| av大片在线看| 亚洲品质自拍视频网站| 日韩精品在线视频免费观看| 在线综合亚洲| 翡翠波斯猫1977年美国|