[Python3]爲何map比for循環快

實驗結論

  • 若是須要在循環結束後得到結果,推薦列表解析;
  • 若是不須要結果,直接使用for循環, 列表解析能夠備選;
  • 除了追求代碼優雅和特定規定情境,不建議使用map

若是不須要返回結果

這裏有三個process, 每一個任務將經過增長循環提升時間複雜度html

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)))

而後經過三種循環方式,去依次執行三種任務python

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)))



從上述的圖像中,能夠直觀的看到, 隨着任務複雜度的提升以及數據量的增大,每一個循環完成須要的時間也在增長,
可是map方式花費的時間明顯比其餘兩種要更多。 因此在不須要返回處理結果時,選擇標準for或者列表解析均可以。git

由於標準for循環和列表解析方式在循環任務複雜度逐漸提升的狀況下,處理時間基本沒有差別。github

須要返回結果

這裏有三個task, 每一個任務將經過增長循環提升時間複雜度app

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)))

而後經過三種循環方式,去依次執行三種任務oop

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)))



從上述的圖像中,能夠直觀的看到, 隨着任務複雜度的提升以及數據量的增大,每一個循環完成須要的時間也在增長,
可是明顯看出, 使用list_comp列表解析在, 循環須要返回處理結果的每次任務中都表現的很好,基本快於其餘兩種迭代方式。測試

而標準for循環和map方式在循環任務複雜度逐漸提升的狀況下,處理時間基本沒有差別。code

爲何廣泛認爲map比for快?

我認爲可能跟處理的數據量有關係,大部分場景下,使用者只測試了少許的數據(100W如下,好比這篇文章,就是數據量比較少,致使速度的區別不明顯),在少許的數據集下,咱們確實看到了map方式比for循環快,甚至有時候比列表解析還稍微快一點,可是當咱們逐漸把數據量增長原來的100倍,這時候差距的凸現出來了。htm

如上圖,在小數據集上(100W-1KW之間), 三者消耗的時間差很少相等,可是用map方式遍歷和處理,仍是有必定的加速優點。
具體實驗代碼能夠經過Github得到blog

相關文章
相關標籤/搜索