欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python內(nèi)存優(yōu)化函數(shù) python內(nèi)存機(jī)制

Python內(nèi)存駐留機(jī)制

字符串駐留機(jī)制在許多面向?qū)ο缶幊陶Z(yǔ)言中都支持,比如Java、python、Ruby、PHP等,它是一種數(shù)據(jù)緩存機(jī)制,對(duì)不可變數(shù)據(jù)類(lèi)型使用同一個(gè)內(nèi)存地址,有效的節(jié)省了空間,本文主要介紹Python的內(nèi)存駐留機(jī)制。

十載的疏附網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整疏附建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“疏附網(wǎng)站設(shè)計(jì)”,“疏附網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

字符串駐留就是每個(gè)字符串只有一個(gè)副本,多個(gè)對(duì)象共享該副本,駐留只針對(duì)不可變數(shù)據(jù)類(lèi)型,比如字符串,布爾值,數(shù)字等。在這些固定數(shù)據(jù)類(lèi)型處理中,使用駐留可以有效節(jié)省時(shí)間和空間,當(dāng)然在駐留池中創(chuàng)建或者插入新的內(nèi)容會(huì)消耗一定的時(shí)間。

下面舉例介紹python中的駐留機(jī)制。

在Python對(duì)象及內(nèi)存管理機(jī)制一文中介紹了python的參數(shù)傳遞以及以及內(nèi)存管理機(jī)制,來(lái)看下面一段代碼:

知道結(jié)果是什么嗎?下面是執(zhí)行結(jié)果:

l1和l2內(nèi)容相同,卻指向了不同的內(nèi)存地址,l2和l3之間使用等號(hào)賦值,所以指向了同一個(gè)對(duì)象。因?yàn)榱斜硎强勺儗?duì)象,每創(chuàng)建一個(gè)列表,都會(huì)重新分配內(nèi)存,列表對(duì)象是沒(méi)有“內(nèi)存駐留”機(jī)制的。下面來(lái)看不可變數(shù)據(jù)類(lèi)型的駐留機(jī)制。

在 Jupyter或者控制臺(tái)交互環(huán)境 中執(zhí)行下面代碼:

執(zhí)行結(jié)果:

可以發(fā)現(xiàn)a1和b1指向了不同的地址,a2和b2指向了相同的地址,這是為什么呢?

因?yàn)閱?dòng)時(shí),Python 將一個(gè) -5~256 之間整數(shù)列表預(yù)加載(緩存)到內(nèi)存中,我們?cè)谶@個(gè)范圍內(nèi)創(chuàng)建一個(gè)整數(shù)對(duì)象時(shí),python會(huì)自動(dòng)引用緩存的對(duì)象,不會(huì)創(chuàng)建新的整數(shù)對(duì)象。

浮點(diǎn)型不支持:

如果上面的代碼在非交互環(huán)境,也就是將代碼作為python腳本運(yùn)行的結(jié)果是什么呢?(運(yùn)行環(huán)境為python3.7)

全為T(mén)rue,沒(méi)有明確的限定臨界值,都進(jìn)行了駐留操作。這是因?yàn)槭褂貌煌沫h(huán)境時(shí),代碼的優(yōu)化方式不同。

在 Jupyter或者控制臺(tái)交互環(huán)境 中:

滿(mǎn)足標(biāo)識(shí)符命名規(guī)范的字符:

結(jié)果:

乘法獲取字符串(運(yùn)行環(huán)境為python3.7)

結(jié)果:

在非交互環(huán)境中:

注意: 字符串是在編譯時(shí)進(jìn)行駐留 ,也就是說(shuō),如果字符串的值不能在編譯時(shí)進(jìn)行計(jì)算,將不會(huì)駐留。比如下面的例子:

在交互環(huán)境執(zhí)行結(jié)果如下:

都指向不同的內(nèi)存。

python 3.7 非交互環(huán)境執(zhí)行結(jié)果:

發(fā)現(xiàn)d和e指向不同的內(nèi)存,因?yàn)閐和e不是在編譯時(shí)計(jì)算的,而是在運(yùn)行時(shí)計(jì)算的。前面的 a = 'aa'*50 是在編譯時(shí)計(jì)算的。

除了上面介紹的python默認(rèn)的駐留外,可以使用sys模塊中的intern()函數(shù)來(lái)指定駐留內(nèi)容

結(jié)果:

使用intern()后,都指向了相同的地址。

本文主要介紹了python的內(nèi)存駐留,內(nèi)存駐留是python優(yōu)化的一種策略,注意不同運(yùn)行環(huán)境下優(yōu)化策略不一樣,不同的python版本也不相同。注意字符串是在編譯時(shí)進(jìn)行駐留。

--THE END--

python使用函數(shù)可以減小內(nèi)存開(kāi)支嗎

函數(shù)其實(shí)也就是封裝好的算法代碼,因?yàn)橐恍┏S煤瘮?shù)都經(jīng)過(guò)開(kāi)發(fā)者,用戶(hù)的多次測(cè)試優(yōu)化,在python的開(kāi)源環(huán)境下更是如此,所以大多時(shí)候比新手開(kāi)發(fā)者自己寫(xiě)的方法內(nèi)存性能都有提升,但針對(duì)不同的需求,自己寫(xiě)新的算法可能更優(yōu),并不絕對(duì)

Python中的10條冷門(mén)知識(shí)

下面時(shí)Python中一些不常見(jiàn)的冷門(mén)知識(shí),感興趣的小伙伴不妨來(lái)學(xué)習(xí)一下。

1、省略號(hào)也是對(duì)象

… 這是省略號(hào),在Python中,一切皆對(duì)象。它也不例外。在 Python 中,它叫做 Ellipsis 。在 Python 3 中你可以直接寫(xiě)…來(lái)得到這玩意。

...

Ellipsis

type(...)

class 'ellipsis'

而在 Python2 中沒(méi)有…這個(gè)語(yǔ)法,只能直接寫(xiě)Ellipsis來(lái)獲取。

Ellipsis

Ellipsis

type(Ellipsis)

type 'ellipsis'

它轉(zhuǎn)為布爾值時(shí)為真

bool(...)

True

最后,這東西是一個(gè)單例。

id(...)

4362672336

id(...)

4362672336

這東西有啥用呢?據(jù)說(shuō)它是Numpy的語(yǔ)法糖,不玩 Numpy 的人,可以說(shuō)是沒(méi)啥用的。

在網(wǎng)上只看到這個(gè) 用 … 代替 pass ,稍微有點(diǎn)用,但又不是必須使用的。

try:

1/0

except ZeroDivisionError:

...

2、增量賦值的性能更好

諸如 += 和 *= 這些運(yùn)算符,叫做 增量賦值運(yùn)算符。這里使用用 += 舉例,以下兩種寫(xiě)法,在效果上是等價(jià)的。

# 第一種

a = 1 ; a += 1

# 第二種

a = 1; a = a + 1

+= 其背后使用的魔法方法是 iadd,如果沒(méi)有實(shí)現(xiàn)這個(gè)方法則會(huì)退而求其次,使用 add 。

這兩種寫(xiě)法有什么區(qū)別呢?

用列表舉例 a += b,使用 add 的話(huà)就像是使用了a.extend(b),如果使用 add 的話(huà),則是 a = a+b,前者是直接在原列表上進(jìn)行擴(kuò)展,而后者是先從原列表中取出值,在一個(gè)新的列表中進(jìn)行擴(kuò)展,然后再將新的列表對(duì)象返回給變量,顯然后者的消耗要大些。

所以在能使用增量賦值的時(shí)候盡量使用它。

3、and 和or 的取值順序

and 和 or 是我們?cè)偈煜げ贿^(guò)的兩個(gè)邏輯運(yùn)算符。而我們通常只用它來(lái)做判斷,很少用它來(lái)取值。

如果一個(gè)or表達(dá)式中所有值都為真,Python會(huì)選擇第一個(gè)值,而and表達(dá)式則會(huì)選擇第二個(gè)。

(2 or 3) * (5 and 7)

14 # 2*7

4、修改解釋器提示符

import sys

sys.ps1

' '

sys.ps2

'... '

sys.ps2 = '---------------- '

sys.ps1 = 'Python編程時(shí)光'

Python編程時(shí)光for i in range(2):

---------------- print (i)

----------------

5、默認(rèn)參數(shù)最好不為可變對(duì)象

函數(shù)的參數(shù)分三種

可變參數(shù)

默認(rèn)參數(shù)

關(guān)鍵字參數(shù)

今天要說(shuō)的是,傳遞默認(rèn)參數(shù)時(shí),新手很容易踩雷的一個(gè)坑。

先來(lái)看一個(gè)示例:

def func(item, item_list=[]):

item_list.append(item)

print(item_list)

func('iphone')

func('xiaomi', item_list=['oppo','vivo'])

func('huawei')

在這里,你可以暫停一下,思考一下會(huì)輸出什么?

思考過(guò)后,你的答案是否和下面的一致呢

['iphone']

['oppo', 'vivo', 'xiaomi']

['iphone', 'huawei']

如果是,那你可以跳過(guò)這部分內(nèi)容,如果不是,請(qǐng)接著往下看,這里來(lái)分析一下。

Python 中的 def 語(yǔ)句在每次執(zhí)行的時(shí)候都初始化一個(gè)函數(shù)對(duì)象,這個(gè)函數(shù)對(duì)象就是我們要調(diào)用的函數(shù),可以把它當(dāng)成一個(gè)一般的對(duì)象,只不過(guò)這個(gè)對(duì)象擁有一個(gè)可執(zhí)行的方法和部分屬性。

對(duì)于參數(shù)中提供了初始值的參數(shù),由于 Python 中的函數(shù)參數(shù)傳遞的是對(duì)象,也可以認(rèn)為是傳地址,在第一次初始化 def 的時(shí)候,會(huì)先生成這個(gè)可變對(duì)象的內(nèi)存地址,然后將這個(gè)默認(rèn)參數(shù) item_list 會(huì)與這個(gè)內(nèi)存地址綁定。在后面的函數(shù)調(diào)用中,如果調(diào)用方指定了新的默認(rèn)值,就會(huì)將原來(lái)的默認(rèn)值覆蓋。如果調(diào)用方?jīng)]有指定新的默認(rèn)值,那就會(huì)使用原來(lái)的默認(rèn)值。

在這里插入圖片描述

6、訪(fǎng)問(wèn)類(lèi)中的私有方法

大家都知道,類(lèi)中可供直接調(diào)用的方法,只有公有方法(protected類(lèi)型的方法也可以,但是不建議)。也就是說(shuō),類(lèi)的私有方法是無(wú)法直接調(diào)用的。

這里先看一下例子

class Kls():

def public(self):

print('Hello public world!')

def __private(self):

print('Hello private world!')

def call_private(self):

self.__private()

ins = Kls()

# 調(diào)用公有方法,沒(méi)問(wèn)題

ins.public()

# 直接調(diào)用私有方法,不行

ins.__private()

# 但你可以通過(guò)內(nèi)部公有方法,進(jìn)行代理

ins.call_private()

既然都是方法,那我們真的沒(méi)有方法可以直接調(diào)用嗎?

當(dāng)然有啦,只是建議你千萬(wàn)不要這樣弄,這里只是普及,讓你了解一下。

# 調(diào)用私有方法,以下兩種等價(jià)

ins._Kls__private()

ins.call_private()

7、時(shí)有時(shí)無(wú)的切片異常

這是個(gè)簡(jiǎn)單例子

my_list = [1, 2, 3, 4, 5]

print(my_list[5])

Traceback (most recent call last):

File "F:/Python Script/test.py", line 2, in module

print(my_list[5])

IndexError: list index out of range

來(lái)看看,如下這種寫(xiě)法就不會(huì)報(bào)索引異常,執(zhí)行my_list[5:],會(huì)返回一個(gè)新list:[]。

my_list = [1, 2, 3]

print(my_list[5:])

8、for 死循環(huán)

for 循環(huán)可以說(shuō)是 基礎(chǔ)得不能再基礎(chǔ)的知識(shí)點(diǎn)了。但是如果讓你用 for 寫(xiě)一個(gè)死循環(huán),你會(huì)寫(xiě)嗎?(問(wèn)題來(lái)自群友 陳**)

這是個(gè)開(kāi)放性的問(wèn)題,在往下看之前,建議你先嘗試自己思考,你會(huì)如何解答。

好了,如果你還沒(méi)有思路,那就來(lái)看一下 一個(gè)海外 MIT 群友的回答:

for i in iter(int, 1):pass

是不是懵逼了。iter 還有這種用法?這為啥是個(gè)死循環(huán)?

這真的是個(gè)冷知識(shí),關(guān)于這個(gè)知識(shí)點(diǎn),你如果看中文網(wǎng)站,可能找不到相關(guān)資料。

還好你可以通過(guò) IDE 看py源碼里的注釋內(nèi)容,介紹了很詳細(xì)的使用方法。

原來(lái)iter有兩種使用方法,通常我們的認(rèn)知是第一種,將一個(gè)列表轉(zhuǎn)化為一個(gè)迭代器。

而第二種方法,他接收一個(gè) callable對(duì)象,和一個(gè)sentinel 參數(shù)。第一個(gè)對(duì)象會(huì)一直運(yùn)行,直到它返回 sentinel 值才結(jié)束。

在這里插入圖片描述

那int 呢,這又是一個(gè)知識(shí)點(diǎn),int 是一個(gè)內(nèi)建方法。通過(guò)看注釋?zhuān)梢钥闯鏊怯心J(rèn)值0的。你可以在終端上輸入 int() 看看是不是返回0。

在這里插入圖片描述

由于int() 永遠(yuǎn)返回0,永遠(yuǎn)返回不了1,所以這個(gè) for 循環(huán)會(huì)沒(méi)有終點(diǎn)。一直運(yùn)行下去。

9、奇怪的字符串

字符串類(lèi)型作為 Python 中最常用的數(shù)據(jù)類(lèi)型之一,Python解釋器為了提高字符串使用的效率和使用性能,做了很多優(yōu)化。

例如:Python 解釋器中使用了 intern(字符串駐留)的技術(shù)來(lái)提高字符串效率。

什么是 intern 機(jī)制?就是同樣的字符串對(duì)象僅僅會(huì)保存一份,放在一個(gè)字符串儲(chǔ)蓄池中,是共用的,當(dāng)然,肯定不能改變,這也決定了字符串必須是不可變對(duì)象。

示例一

# Python2.7

a = "Hello_Python"

id(a)

32045616

id("Hello" + "_" + "Python")

32045616

# Python3.7

a = "Hello_Python"

id(a)

38764272

id("Hello" + "_" + "Python")

32045616

示例二

a = "MING"

b = "MING"

a is b

True

# Python2.7

a, b = "MING!", "MING!"

a is b

True

# Python3.7

a, b = "MING!", "MING!"

a is b

False

示例三

# Python2.7

'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'

True

'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'

False

# Python3.7

'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'

True

'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'

True

示例四

s1="hello"

s2="hello"

s1 is s2

True

# 如果有空格,默認(rèn)不啟用intern機(jī)制

s1="hell o"

s2="hell o"

s1 is s2

False

# 如果一個(gè)字符串長(zhǎng)度超過(guò)20個(gè)字符,不啟動(dòng)intern機(jī)制

s1 = "a" * 20

s2 = "a" * 20

s1 is s2

True

s1 = "a" * 21

s2 = "a" * 21

s1 is s2

False

s1 = "ab" * 10

s2 = "ab" * 10

s1 is s2

True

s1 = "ab" * 11

s2 = "ab" * 11

s1 is s2

False

10、兩次return

我們都知道,try…finally… 語(yǔ)句的用法,不管 try 里面是正常執(zhí)行還是報(bào)異常,最終都能保證finally能夠執(zhí)行。

同時(shí),我們又知道,一個(gè)函數(shù)里只要遇到 return 函數(shù)就會(huì)立馬結(jié)束。

基于以上這兩點(diǎn),我們來(lái)看看這個(gè)例子,到底運(yùn)行過(guò)程是怎么樣的?

def func():

... try:

... return 'try'

... finally:

... return 'finally'

...

func()

'finally'

驚奇的發(fā)現(xiàn),在try里的return居然不起作用。

原因是,在try…finally…語(yǔ)句中,try中的return會(huì)被直接忽視,因?yàn)橐WCfinally能夠執(zhí)行。

分享題目:python內(nèi)存優(yōu)化函數(shù) python內(nèi)存機(jī)制
瀏覽路徑:http://chinadenli.net/article30/hgjpso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管網(wǎng)站導(dǎo)航企業(yè)網(wǎng)站制作營(yíng)銷(xiāo)型網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名