關於python條件推導式與filter的效能比較

2021-10-10 12:58:47 字數 3104 閱讀 5949

目錄

一、前言

二、**

三、結果

四、另乙個樣例

五、結論

最近在專案中應用python的推導式比較多,主要是考慮到推導式很簡潔,且可讀性高,所以沒有用filter。有空了忽然想比較分析一下python推導式和filter效能的比較。最終結果讓我還挺開心,看來用推導式路子選對了(雖然這點效率提公升可忽略不計)。後文也丟擲了乙個疑問,希望能一起**。

import datetime

# 生成一千萬的列表用於測試

testlist = [x for x in range(10000000)]

def func_tuidao():

starttime = datetime.datetime.now()

cnt = 10 # 迴圈次數

newlist =

while cnt > 0:

newlist = [item for item in testlist if item % 3 == 0]

cnt -= 1

endtime = datetime.datetime.now()

print('推導式耗時: %s' % (endtime - starttime))

def func_filter():

starttime = datetime.datetime.now()

cnt = 10 # 迴圈次數

newlist =

while cnt > 0:

newlist = list(filter(lambda item: item % 3 == 0, testlist))

cnt -= 1

endtime = datetime.datetime.now()

print('filter耗時: %s' % (endtime - starttime))

func_tuidao()

func_filter()

本地用1000w的記錄測試結果如下,測試了六次,推導式耗時基本在6.5秒左右,但filter加lambda耗時在13秒左右,近乎推導式的兩倍。cpu和記憶體未滿載。

import datetime

# 生成一千萬的列表用於測試

testlist = [x for x in range(10000000)]

def func_filter():

starttime = datetime.datetime.now()

cnt = 10

newlist =

while cnt > 0:

newlist = list(filter(lambda item: item % 3 == 0, testlist))

cnt -= 1

endtime = datetime.datetime.now()

print('filter耗時: %s' % (endtime - starttime))

def func_filter2():

starttime = datetime.datetime.now()

cnt = 10

newlist =

while cnt > 0:

# 與func_filter區別僅在於此,不立即生成列表

newlist = filter(lambda item: item % 3 == 0, testlist)

cnt -= 1

endtime = datetime.datetime.now()

print('filter2耗時: %s' % (endtime - starttime))

func_filter()

func_filter2()

執行結果:func_filter2()執行耗時為0了

怎麼會為0了呢?讓我們再進一步用**分析:

import datetime

# 此處列表大小就改小一點了,我們列印出來結果看

testlist = [x for x in range(1000)]

def func_filter2():

starttime = datetime.datetime.now()

cnt = 10

newlist =

while cnt > 0:

# 與func_filter區別僅在於此,不立即生成列表

newlist = filter(lambda item: item % 3 == 0, testlist)

print('----------l', cnt)

print(newlist)

print(type(newlist))

cnt -= 1

print('******************')

tmp = list(newlist)

print(tmp)

print(type(tmp))

endtime = datetime.datetime.now()

print('filter2耗時: %s' % (endtime - starttime))

func_filter2()

1、看來真正耗時的階段是生成列表時,而不是篩選過濾的時候?

2、filter的返回結果只是乙個類物件,並未真正執行後面的過濾,等到後面執行到list(newlist)時,才會開始去執行?

1、推導式可讀性比filter加lambda更高,且更簡潔。

2、推導式耗時更小。

python 推導 Python 推導式

python 語言有一種獨特的語法,它可以用最簡單的方式生成乙個列表 元組或字典,它們叫推導式。常見的推導式 列表推導式 字典推導式 集合推導式 列表推導式 列表推導式可以快速生成乙個列表,其語法格式為 x x for x in range 6 結果 0,1,4,9,16,25 相當於 l for ...

Python之 列表推導式與字典推導式

四 列表推導式與字典推導式 在 python 中推導式是一種非常 pythonic 的知識,本篇將解答列表推導式與字典推導式相關的技術知識。4.1 列表推導式 列表推導式可以利用列表,元組,字典,集合等資料型別,快速的生成乙個特定需要的列表。語法格式如下 表示式 for 迭代變數 in 可迭代物件 ...

Python列表推導式,集合推導式,元組推導式

先定義乙個列表a a 1,2,3,4,5,6,7,8 1a 1,2,3,4,5,6,7,8 列表推導 d i 2 for i in a 集合推導 e 元組推導 f i 2 for i in a print type d print type e print type f 輸出 123 4567 89...