2016-11-24 79 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循环为可读,就永远不会有更好的表现,而且通常都会有糟糕性能,因为需要提供反复调用的函数。它只是允许你编程一个功能风格的外观,没有任何功能语言提供的常见好处来支持它。