您好,登錄后才能下訂單哦!
這篇“Python編程的兩處陷阱是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Python編程的兩處陷阱是什么”文章吧。
不可變對(duì)象陷阱
思路:生成1百萬(wàn)個(gè)隨機(jī)字符串,分別使用不可對(duì)象或可變對(duì)象合并字符串,比較花費(fèi)時(shí)間。
生成隨機(jī)字符串的代碼:
import random
import time
big = [chr(i) for i in range(65,91)]
small = [chr(i) for i in range(97,123)]
def randNStr(n):
...: result = []
...: for i in range(n):
...: strlen = random.randint(3,9)
...: result.append(''.join(random.sample(small+big,strlen)))
...: return result
使用不可變對(duì)象方法:combine+s 再賦值給combine,這條語(yǔ)句:因?yàn)閏ombine, s都為不可變對(duì)象,返回的結(jié)果就是新生成一個(gè)對(duì)象,對(duì)象不斷堆積。
def immfn(n): ...: combine='' ...: res = randNStr(n) ...: beg = time.time() ...: print('beg time %s'%str(beg)) ...: for s in res: ...: combine = combine + s ...: #print(combine) ...: end = time.time() ...: print('end time %s'%str(end)) ...: print('elispe time: %s'%str(end-beg))
為了避免重復(fù)生成新的對(duì)象,使用可變對(duì)象,文中 Python解惑之對(duì)象可變與不可變 提到過(guò),一般可迭代對(duì)象,都是可變的。
def mutfn(n):
...: combine=''
...: res = randNStr(n)
...: beg = time.time()
...: print('beg time %s'%str(beg))
...: combine = ''.join(res)
...: #print('print result:%s'%combine)
...: end = time.time()
...: print('end time %s'%str(end))
...: print('elispe time: %s'%str(end-beg))
此處使用 str.join(iter),接受可迭代對(duì)象,并只返回一個(gè)新對(duì)象。比較以上兩種方法的計(jì)算時(shí)間,分別從10萬(wàn),步長(zhǎng)10萬(wàn),終止到100萬(wàn),比較分析合并字符串的時(shí)間。
可以看到可變對(duì)象只生成一個(gè)新對(duì)象的方法,比不可變對(duì)象在數(shù)據(jù)量越大情況下,優(yōu)勢(shì)更明顯,呈現(xiàn)擴(kuò)張的喇叭口,當(dāng)數(shù)據(jù)為90萬(wàn)時(shí),節(jié)省時(shí)間成本高達(dá):(0.19-0.025)/0.025 = 6.6 倍。當(dāng)數(shù)據(jù)量增長(zhǎng)到1千萬(wàn)或更大時(shí),優(yōu)勢(shì)更明顯。
可變對(duì)象陷阱
BAT面試題26:一道Python填空題
題目是這樣的:
def f(x,l=[]):
...: for i in range(x):
...: l.append(i*i)
...: print(l)
f(2)
f(3)
結(jié)果為:
In [2]: f(2)
[0, 1]
In [3]: f(3)
[0, 1, 0, 1, 4]
原因,可變對(duì)象作為函數(shù)參數(shù),并被設(shè)為默認(rèn)值后,當(dāng)被再次調(diào)用函數(shù)后,函數(shù)參數(shù)原來(lái)取值將被再次索引。
為了避免這個(gè)問(wèn)題,可變對(duì)象的默認(rèn)值一般取值為常數(shù):None
def f(x,l=None):
...: if l is None:
...: l = []
...: for i in range(x):
...: l.append(i*i)
...: print(l)
...:
這樣連續(xù)被調(diào)用時(shí),將會(huì)按照預(yù)期輸出。
以上就是關(guān)于“Python編程的兩處陷阱是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。