python map比f(wàn)or循環(huán)快在哪
實(shí)驗(yàn)結(jié)論
- 如果需要在循環(huán)結(jié)束后獲得結(jié)果,推薦列表解析;
- 如果不需要結(jié)果,直接使用for循環(huán), 列表解析可以備選;
- 除了追求代碼優(yōu)雅和特定規(guī)定情境,不建議使用map
如果不需要返回結(jié)果
這里有三個(gè)process, 每個(gè)任務(wù)將通過(guò)增加循環(huán)提高時(shí)間復(fù)雜度
def process1(val, type=None): chr(val % 123) def process2(val, type): if type == "list": [process1(_) for _ in range(val)] elif type == "for": for _ in range(val): process1(_) elif type == "map": list(map(lambda _: process1(_), range(val))) def process3(val, type): if type == "list": [process2(_, type) for _ in range(val)] elif type == "for": for _ in range(val): process2(_, type) elif type == "map": list(map(lambda _: process2(_, type), range(val)))
然后通過(guò)三種循環(huán)方式,去依次執(zhí)行三種任務(wù)
def list_comp(): [process1(i, "list") for i in range(length)] # [process2(i, "list") for i in range(length)] # [process3(i, "list") for i in range(length)] def for_loop(): for i in range(length): process1(i, "for") # process2(i, "for") # process3(i, "for") def map_exp(): list(map(lambda v: process1(v, "map"), range(length))) # list(map(lambda v: process2(v, "map"), range(length))) # list(map(lambda v: process3(v, "map"), range(length)))
從上述的圖像中,可以直觀的看到, 隨著任務(wù)復(fù)雜度的提高以及數(shù)據(jù)量的增大,每個(gè)循環(huán)完成需要的時(shí)間也在增加,
但是map方式花費(fèi)的時(shí)間明顯比其他兩種要更多。 所以在不需要返回處理結(jié)果時(shí),選擇標(biāo)準(zhǔn)for或者列表解析都可以。
因?yàn)闃?biāo)準(zhǔn)for循環(huán)和列表解析方式在循環(huán)任務(wù)復(fù)雜度逐漸提高的情況下,處理時(shí)間基本沒(méi)有差異。
需要返回結(jié)果
這里有三個(gè)task, 每個(gè)任務(wù)將通過(guò)增加循環(huán)提高時(shí)間復(fù)雜度
def task1(val, type=None): return chr(val % 123) def task2(val, type): if type == "list": return [task1(_) for _ in range(val)] elif type == "for": res = list() for _ in range(val): res.append(task1(_)) return res elif type == "map": return list(map(lambda _: task1(_), range(val))) def task3(val, type): if type == "list": return [task2(_, type) for _ in range(val)] elif type == "for": res = list() for _ in range(val): res.append(task2(_, type)) return res elif type == "map": return list(map(lambda _: task2(_, type), range(val)))
然后通過(guò)三種循環(huán)方式,去依次執(zhí)行三種任務(wù)
def list_comp(): # return [task1(i, "list") for i in range(length)] return [task2(i, "list") for i in range(length)] # return [task3(i, "list") for i in range(length)] def for_loop(): res = list() for i in range(length): # res.append(task1(i, "for")) res.append(task2(i, "for")) # res.append(task3(i, "for")) return res def map_exp(): # return list(map(lambda v: task1(v, "map"), range(length))) return list(map(lambda v: task2(v, "map"), range(length))) # return list(map(lambda v: task3(v, "map"), range(length)))
從上述的圖像中,可以直觀的看到, 隨著任務(wù)復(fù)雜度的提高以及數(shù)據(jù)量的增大,每個(gè)循環(huán)完成需要的時(shí)間也在增加,
但是明顯看出, 使用list_comp列表解析在, 循環(huán)需要返回處理結(jié)果的每次任務(wù)中都表現(xiàn)的很好,基本快于其他兩種迭代方式。
而標(biāo)準(zhǔn)for循環(huán)和map方式在循環(huán)任務(wù)復(fù)雜度逐漸提高的情況下,處理時(shí)間基本沒(méi)有差異。
為什么普遍認(rèn)為map比f(wàn)or快?
我認(rèn)為可能跟處理的數(shù)據(jù)量有關(guān)系,大部分場(chǎng)景下,使用者只測(cè)試了少量的數(shù)據(jù)(100W以下,比如這篇文章,就是數(shù)據(jù)量比較少,導(dǎo)致速度的區(qū)別不明顯),在少量的數(shù)據(jù)集下,我們確實(shí)看到了map方式比f(wàn)or循環(huán)快,甚至有時(shí)候比列表解析還稍微快一點(diǎn),但是當(dāng)我們逐漸把數(shù)據(jù)量增加原來(lái)的100倍,這時(shí)候差距的凸現(xiàn)出來(lái)了。
如上圖,在小數(shù)據(jù)集上(100W-1KW之間), 三者消耗的時(shí)間差不多相等,但是用map方式遍歷和處理,還是有一定的加速優(yōu)勢(shì)。
具體實(shí)驗(yàn)代碼可以通過(guò)Github獲得
以上就是python 為什么map比f(wàn)or循環(huán)快的詳細(xì)內(nèi)容,更多關(guān)于python map和for循環(huán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python二叉樹(shù)的實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了python二叉樹(shù)的實(shí)現(xiàn)實(shí)例,大家參考使用吧2013-11-11詳解利用Python scipy.signal.filtfilt() 實(shí)現(xiàn)信號(hào)濾波
這篇文章主要介紹了詳解利用Python scipy.signal.filtfilt() 實(shí)現(xiàn)信號(hào)濾波,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06python實(shí)現(xiàn)簡(jiǎn)單加密解密機(jī)制
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單加密解密機(jī)制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03Jupyter notebook 更改文件打開(kāi)的默認(rèn)路徑操作
這篇文章主要介紹了Jupyter notebook 更改文件打開(kāi)的默認(rèn)路徑操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05Python跳出循環(huán)語(yǔ)句continue與break的區(qū)別
這篇文章主要介紹了Python跳出循環(huán)語(yǔ)句continue與break的區(qū)別,本文用實(shí)例來(lái)說(shuō)明它們之間的區(qū)別,簡(jiǎn)單易記易懂,需要的朋友可以參考下2014-08-08Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線(xiàn)程
這篇文章主要介紹了Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線(xiàn)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Python用zip函數(shù)同時(shí)遍歷多個(gè)迭代器示例詳解
這篇文章主要給大家進(jìn)行介紹了Python如何用zip函數(shù)同時(shí)遍歷多個(gè)迭代器,文中給出了示例以及原理和注意事項(xiàng),相信會(huì)對(duì)大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11