当您可以以更 Pythonic 的方式使用 collections.Counter() 和 map() 函数时,以如此复杂的方式使用 reduce 并不是一个好主意:
>>> A = [[1], [1,2], [1,2], [1,2,3]]
>>> from collections import Counter
>>>
>>> Counter(map(len,A))
Counter({2: 2, 1: 1, 3: 1})
请注意,使用map 将比生成器表达式执行得稍好,因为通过将生成器表达式传递给Counter(),python 将自行从生成器函数中获取值,因为使用内置函数map 具有更高的性能在执行时间方面1.
~$ python -m timeit --setup "A = [[1], [1,2], [1,2], [1,2,3]];from collections import Counter" "Counter(map(len,A))"
100000 loops, best of 3: 4.7 usec per loop
~$ python -m timeit --setup "A = [[1], [1,2], [1,2], [1,2,3]];from collections import Counter" "Counter(len(x) for x in A)"
100000 loops, best of 3: 4.73 usec per loop
来自PEP 0289 -- Generator Expressions:
生成器表达式的语义等价于创建匿名生成器函数并调用它。例如:
g = (x**2 for x in range(10))
print g.next()
相当于:
def __gen(exp):
for x in exp:
yield x**2
g = __gen(iter(range(10)))
print g.next()
请注意,由于 generator expression 在内存使用方面更好,如果您正在处理大数据,您最好使用 generator expression 而不是 map 功能。