Python循環(huán)、列表生成器、filter效率對比試驗(yàn)

本篇閱讀時間約為 5 分鐘。
前言
在編程的過程中,大家肯定會遇到一個場景,就是類似在 list、set、tuple 中根據(jù)某些條件進(jìn)行過濾,篩選過后生成新的元素列表。
對于這個場景而言,在 Python 中有許多中不同的方案可以去解決,那么哪一種才是效率最高的?今天就來小小的做個實(shí)驗(yàn)體驗(yàn)下。
環(huán)境介紹
兩臺 windows 電腦,Python 版本均為 3.0+ 。代碼相同,不同的是 CPU。
筆者 CPU 型號:

同學(xué) CPU 型號:


測試場景代碼
假設(shè)現(xiàn)在的場景是有一個含有 1000 個數(shù)字的列表,其中這個列表中包含正數(shù)和負(fù)數(shù),如果讓你將所有正數(shù)挑選出來并且生成新的列表,如何解決?(如果看過筆者之前小課堂的示例,就知道方案都介紹過。)
生成 1000 個 -100 到 100 的隨機(jī)list:
from timeit import timeit import random random.seed(10)??#?為了讓每次隨機(jī)結(jié)果相同,設(shè)置隨機(jī)種子 x_list = [random.randint(-100, 100) for _ in range(1000)]
思考過后再往下看:
方案一,最常規(guī)寫法 for 遍歷:
def for_func():
""" for 循環(huán)測試 """
new_list = []
for x in x_list:
if x > 0:
new_list.append(x)
return new_list
方案二,列表生成式:
new_list = [x?for?x?in?x_list?if?x?>?0]
方案三,filter高級函數(shù):
new_list = list(filter(lambda x: x > 0, x_list))
測試效率
在 Python 中,有一個模塊叫 timeit,此模塊可以直接進(jìn)行效率測速,來簡單的看下官方文檔如何介紹的:

如果大家有所了解,Python 解釋器是有不同版本的,平時我們用的是 CPython 解釋器,上面的方法即 CPython 的用法。若是在 IPython 中,則可以直接用 timeit xxxx 來進(jìn)行使用。
在 CPython 中,我選擇的是圖中紅框部分的示例代碼來做演示:

如果 number 參數(shù)不寫的話,默認(rèn)是循環(huán) 100000 次來執(zhí)行。在測試用例中,number 默認(rèn),可以進(jìn)源碼查看:

測試用例元素個數(shù) 1000 ,每種寫法循環(huán)測試 100000 次。
結(jié)果,
我的:

同學(xué)的:

測試用例元素個數(shù) 100 ,每種寫法循環(huán)測試 100000 次。
結(jié)果,
我的:

同學(xué)的:

拓展
關(guān)于字典和集合,也是可以使用生成器形式來進(jìn)行此場景過濾的,回顧:python小課堂34 - 推導(dǎo)式與生成器
總結(jié)
綜上所述,在此場景下,效率最高的列表推導(dǎo)式,若是簡單的邏輯,推薦大家使用列表推導(dǎo)式寫法,如果推導(dǎo)式滿足不了需求,在考慮另外兩種。
