2016-11-24 78 views
0

我重構代碼是這樣的:瞭解蟒蛇內建希望減少

def get_ana(word): 
    return ''.join(sorted(word.lower())) 

def combine_anagrams(words): 
    sets = {} 
    for word in words: 
     ana = get_ana(word) 
     sets[ana] = sets.get(ana, []) + [word] 

    return sets.values() 

爲了這樣的事情:

def combine_anagrams(words): 
    return reduce(add_ana, words, {}).values() 

def add_ana(sets, word): 
    ana = ''.join(sorted(word.lower())) 
    sets[ana] = sets.get(ana, []) + [word] 
    return sets 

我知道這被認爲是更多的功能。

但是,改變(在Python中)的真正好處是什麼?

內存使用,GC,不管它可能是什麼。

+1

我認爲第一個代碼更好。它更具可讀性,它們在計算上類似。你的「功能性」代碼違背了理想:一個函數不應該用'sets [ana] = ...行來改變對象的狀態,所以它沒有「更可預測」的優點。 –

+0

可讀性降低? ;)FWIW,[Guido不是'reduce'的粉絲](http://www.artima.com/weblogs/viewpost.jsp?thread=98196),尤其是當它的函數arg不是關聯的,而且它不是在Python 3中內置的時間更長:它已被降級到'functools'。 Guido想完全清除它,但是在抗議隨後發生後被迫保留。 –

+0

@Jared,我意識到我正在改變這個狀態。你的觀點是我的問題的緊張。然而,也許'{}'作爲一個參數來減少坐在內存不同,因此有好處。 –

回答

2

for循環實際上是遞歸在函數式編程語言中提供的相同抽象。 Python中的reduce函數要求您將用戶定義的函數中的for循環的主體封裝起來,而這些函數會產生一層損害性能的開銷。

Python不優化遞歸以及大多數函數式語言(實際上,它根本不會優化它),因爲函數式語言會選擇使遞歸成爲遞歸的唯一(或至少是主要)方法,而Python則提供forwhile循環來有效地遍歷數據結構。

最後,使用reduce很少會作爲一個簡單的for循環爲可讀,就永遠不會有更好的表現,而且通常都會有糟糕性能,因爲需要提供反覆調用的函數。它只是允許你編程一個功能風格的外觀,沒有任何功能語言提供的常見好處來支持它。