第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Python何時(shí)為相同的字符串分配新內(nèi)存?

Python何時(shí)為相同的字符串分配新內(nèi)存?

尚方寶劍之說 2019-07-27 10:45:10
Python何時(shí)為相同的字符串分配新內(nèi)存?兩個(gè)具有相同字符的Python字符串,a == b,可以共享內(nèi)存,id(a)== id(b),或者可以在內(nèi)存中兩次,id(a)!= id(b)。嘗試ab = "ab"print id( ab ), id( "a"+"b" )在這里,Python認(rèn)識(shí)到新創(chuàng)建的“a”+“b”與已經(jīng)在內(nèi)存中的“ab”相同 - 不錯(cuò)?,F(xiàn)在考慮一個(gè)N長的州名列表[“亞利桑那州”,“阿拉斯加”,“阿拉斯加”,“加利福尼亞”......](在我的案例中為N~500000)。我看到50個(gè)不同的id()s?每個(gè)字符串“Arizona”......只存儲(chǔ)一次,很好。但是將列表寫入磁盤并再次讀回:“相同”列表現(xiàn)在有N個(gè)不同的id()s,內(nèi)存更多,見下文。怎么 - 任何人都可以解釋Python字符串內(nèi)存分配?""" when does Python allocate new memory for identical strings ?     ab = "ab"     print id( ab ), id( "a"+"b" )  # same !     list of N names from 50 states: 50 ids, mem ~ 4N + 50S, each string once     but list > file > mem again: N ids, mem ~ N * (4 + S) """from __future__ import divisionfrom collections import defaultdictfrom copy import copyimport cPickleimport randomimport sys states = dict(AL = "Alabama",AK = "Alaska",AZ = "Arizona",AR = "Arkansas",CA = "California",CO = "Colorado",CT = "Connecticut",DE = "Delaware",FL = "Florida",GA = "Georgia",)def nid(alist):     """ nr distinct ids """     return "%d ids  %d pickle len" % (         len( set( map( id, alist ))),         len( cPickle.dumps( alist, 0 )))  # rough est ?# cf http://stackoverflow.com/questions/2117255/python-deep-getsizeof-list-with-contentsN = 10000exec( "\n".join( sys.argv[1:] ))  # var=val ...random.seed(1)     # big list of random names of states --names = []for j in xrange(N):     name = copy( random.choice( states.values() ))     names.append(name)print "%d strings in mem:  %s" % (N, nid(names) )  # 10 ids, even with copy()添加25jan:Python內(nèi)存(或任何程序)中有兩種字符串:Ustrings,在一個(gè)獨(dú)特字符串的Ucache中:這些節(jié)省內(nèi)存,如果兩者都在Ucache中,則快速== bOstrings,其他,可以存儲(chǔ)任意次數(shù)。intern(astring)在Ucache中放入astring(Alex +1); 除此之外我們對Python如何將Ostrings移動(dòng)到Ucache一無所知 - “ab”之后“a”+“b”是如何進(jìn)入的?(“來自文件的字符串”毫無意義 - 沒有辦法知道。)簡而言之,Ucaches(可能有幾個(gè))仍然是模糊的。一個(gè)歷史腳注: SPITBOL 統(tǒng)一所有字符串ca. 1970年。
查看完整描述

3 回答

?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊

Python語言的每個(gè)實(shí)現(xiàn)都可以自由地在分配不可變對象(例如字符串)時(shí)做出權(quán)衡 - 要么創(chuàng)建一個(gè)新的對象,要么找到一個(gè)現(xiàn)有的等價(jià)對象并再使用一個(gè)對它的引用,就好了。觀點(diǎn)看法。當(dāng)然,在實(shí)踐中,現(xiàn)實(shí)世界的實(shí)現(xiàn)需要合理的妥協(xié):在定位這樣的對象時(shí),再一次提及合適的現(xiàn)有對象既便宜又容易,只要找到一個(gè)合適的現(xiàn)有對象(可能是可能不存在)看起來可能需要很長時(shí)間搜索。

因此,例如,在單個(gè)函數(shù)中多次出現(xiàn)相同的字符串文字(在我所知的所有實(shí)現(xiàn)中)都使用“對同一對象的新引用”策略,因?yàn)樵跇?gòu)建該函數(shù)的常量池時(shí),它非常快速且容易避免重復(fù); 但是跨越不同的功能這樣做可能是一項(xiàng)非常耗時(shí)的任務(wù),因此現(xiàn)實(shí)世界的實(shí)施要么根本不做,要么只在一些啟發(fā)式確定的案例子集中做到這一點(diǎn),人們可以希望合理權(quán)衡編譯時(shí)間(通過搜索相同的現(xiàn)有常量減慢)與內(nèi)存消耗(如果繼續(xù)生成新的常量副本,則增加)。

我不知道Python的任何實(shí)現(xiàn)(或者其他具有常量字符串的語言,例如Java)在從文件讀取數(shù)據(jù)時(shí)會(huì)花費(fèi)很多時(shí)間來識(shí)別可能的重復(fù)項(xiàng)(通過多個(gè)引用重用單個(gè)對象) - - 它似乎并不是一個(gè)很有希望的權(quán)衡(在這里你需要支付運(yùn)行時(shí)間,而不是編譯時(shí)間,因此權(quán)衡更具吸引力)。當(dāng)然,如果您知道(由于應(yīng)用程序級別的考慮因素)這些不可變對象很大并且很容易出現(xiàn)重復(fù),您可以非常輕松地實(shí)現(xiàn)自己的“常量池”策略(實(shí)習(xí)生可以幫助您為字符串執(zhí)行此操作,但是你不難推出自己的東西,例如,帶有不可變項(xiàng)目的元組,巨大的長整數(shù),


查看完整回答
反對 回復(fù) 2019-07-27
?
繁華開滿天機(jī)

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊

我強(qiáng)烈懷疑Python在這里表現(xiàn)得像許多其他語言一樣 - 在源代碼中識(shí)別字符串常量并使用公用表,但在動(dòng)態(tài)創(chuàng)建字符串時(shí)應(yīng)用相同的規(guī)則。這是有道理的,因?yàn)樵创a中只有一組有限的字符串(當(dāng)然,Python允許你動(dòng)態(tài)地評估代碼),而你在程序過程中創(chuàng)建大量字符串的可能性更大。 。

這個(gè)過程通常被稱為實(shí)習(xí) - 實(shí)際上,通過這個(gè)頁面的外觀,它也被稱為Python實(shí)習(xí)。


查看完整回答
反對 回復(fù) 2019-07-27
?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊

旁注:了解Python中對象的生命周期非常重要。請注意以下會(huì)話:

Python 2.6.4 (r264:75706, Dec 26 2009, 01:03:10) [GCC 4.3.4] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> a="a">>> b="b">>> print id(a+b), id(b+a)134898720 134898720>>> print (a+b) is (b+a)False

您認(rèn)為通過打印兩個(gè)單獨(dú)表達(dá)式的ID 并注意到“它們是相等的,兩個(gè)表達(dá)式必須相等/等同/相同”是錯(cuò)誤的。單行輸出并不一定意味著它的所有內(nèi)容都是在同一時(shí)刻創(chuàng)建和/或共存的。

如果您想知道兩個(gè)對象是否是同一個(gè)對象,請直接詢問Python(使用is運(yùn)算符)。


查看完整回答
反對 回復(fù) 2019-07-27
  • 3 回答
  • 0 關(guān)注
  • 698 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)