Guido(python的设计者)说,每当我看到reduce
函数作用于一个non-trivial function(函数功能不那么直观的函数),我就想问自己,我当初为什么要设计如此蹩脚的内置函数,以至于我需要拿出纸和笔勾勾画画才能搞明白reduce
函数的真正意图,而且效率不见得比list comprehension高。所以,他一怒之下,在python3中,将reduce
贬为二等公民,也即,从内置函数降级为functools
内的一个函数。
这里我想为reduce
函数说几句话,有些情况下,reduce
函数比list compression
以及循环迭代,简洁强大的多的多。
考虑如下的需求,我们需要将由numpy.ndarray构成的sub_lists,再由这些sub_lists构成的list,进行累加(同等ndarray进行相加)求和时,我们该如何做?
不使用reduce
函数的情形:
topology = [3, 2, 1]
biases = [np.random.randn(y, 1) for y in topology[1:]]
# 由ndarray构成的sub_lists
bs = [biases, biases, biases]
# 由sub_lists构成的list
t = [np.zeros(b.shape) for b in biases]
# 基准值
for b in bs:
t = [x+y for x, y in zip(b, t)]
# 第一层从list中取出sub_lists
# 第二层从sub_lists中取出ndarray
print(t)
我们来看reduce
函数的做法:
import functools
def zip_sum(x, y):
return [a+b for a, b in zip(x, y)]
print(functools.reduce(zip_sum, bs))
所以reduce
:
避免了循环
避免了基准值的手动定义