我重构了类似的代码:
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,无论它是什么。
答案 0 :(得分:2)
for
循环实际上是递归在函数式编程语言中提供的抽象。 Python中的reduce
函数要求您打包用户定义函数中的for
循环体,否则会产生一层影响性能的开销。
Python不优化递归以及大多数函数式语言(实际上,它根本不对它进行优化),因为函数式语言选择使递归成为递归的唯一(或至少是主要)方法虽然Python提供了for
和while
循环来有效地迭代数据结构。
最后,使用reduce
很少会像简单的for
循环那样具有可读性,但永远不会有更好的性能,并且通常会有更差的性能需要提供一个被重复调用的函数。它只允许您使用函数式的外观进行编程,而不需要函数式语言提供的任何常用优势来支持它。