理解python内置类似reduce

时间:2016-11-24 13:56:05

标签: python functional-programming

我重构了类似的代码:

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 个答案:

答案 0 :(得分:2)

for循环实际上是递归在函数式编程语言中提供的抽象。 Python中的reduce函数要求您打包用户定义函数中的for循环体,否则会产生一层影响性能的开销。

Python不优化递归以及大多数函数式语言(实际上,它根本不对它进行优化),因为函数式语言选择使递归成为递归的唯一(或至少是主要)方法虽然Python提供了forwhile循环来有效地迭代数据结构。

最后,使用reduce很少会像简单的for循环那样具有可读性,但永远不会有更好的性能,并且通常会有更差的性能需要提供一个被重复调用的函数。它只允许您使用函数式的外观进行编程,而不需要函数式语言提供的任何常用优势来支持它。