2017-04-09 56 views
0

在下面的示例中的單線程或for循環之間的性能是否有任何差異?下面是一個代碼片段,我用做的東西:何時使用循環與單線程

# convert to integer, subtract 1, and change to 0 if number is < 0 
tile_ids = map(lambda x: max(int(x)-1, 0), child[0].text.split(',')) 

是更好地做到這一點,或寫出這樣的:同樣

for tile_id in child[0].text.split(','): 
    tile_id = int(tile_id) - 1 
    if tile_id < 0: 
     tile_id = 0 

,有沒有理由使用一個比其他?

+4

第三種選擇,中景:'tile_ids = MAX(INT(X) - 1,0),用於兒童[0]的.text X。 split(',')]' –

+2

列表解析更快。如果它們可以放在一行上,可以通過'for'循環選項使用它們,否則首先考慮可讀性並使用循環。帶有'lambda'的'map()'通常比較慢(爲所有的map調用創建了大量的函數框架)。當你有一個本地函數/方法時使用'map()'。 –

+0

您可以使用['timeit'](https://docs.python.org/3/library/timeit.html)模塊查找自己的表現差異。至於比其他人更喜歡的原因,第二個的可讀性對我來說是一個足夠好的理由。 –

回答

1

對於這種特定情況,使用map而不是for循環的性能方面沒有那麼多。可能使用地圖比後一種方法要糟糕一些,因爲你隱式地使用了「額外的東西」,在這種情況下,它並不是非常有用。

當您具有並行化任務的能力時,「map-approach」可能非常有用。在這種情況下,你肯定可以獲得比普通的for循環更好的性能。

由於可讀性,我更喜歡第二個版本。另一種方法是使用列表理解:

title_ids = [max(int(x)-1,0) for x in child[0].text.split(',')]