python - 你什么时候会使用 reduce() 而不是 sum()?

标签 python functional-programming profiling

我最近开始学习函数式编程,并在尝试计算我的类(class)测验平均分时想出了这个例子。

我想出的例子是:

scores = [90, 91, 92, 94, 95, 96, 97, 99, 100]

def add(num1, num2):
    '''returns the sum of the parameters'''
    return num1 + num2

import operator 

timeit reduce(add, scores) / len(scores)  #--> 1000000 loops, best of 3: 799 ns per loop

timeit sum(scores) / len(scores)  #--> 1000000 loops, best of 3: 207 ns per loop

timeit reduce(operator.add, scores) / len(scores) #--> 1000000 loops, best of 3: 485 ns per loop

在上面的例子中,使用高阶函数似乎慢了将近 4 倍。

所以我的问题是,什么时候是使用高阶函数的好时机,因为上面的例子显然不是?

最佳答案

当您需要对数据列表进行任意操作时,

reduce() 才有意义,而不是当您已经拥有一个不仅性能优于 reduce() 在小列表上,但大大在大列表上优于它。

reduce() 为您提供了创建任意折叠的灵 active ,但这种灵 active 是以一些性能开销为代价的,尤其是在大多数基本函数构造被认为略微超出主流的语言中。

Python 是“函数式”的,因为它具有一流的函数,但它主要不是一种函数式语言。它提供了大量用于循环的迭代器,并具有使显式循环易于编写的各种语言特性,但并不专注于递归定义的列表操作(尽管它确实在有限程度上允许它们——缺乏 TCO阻止我直接在 Python 中解释我的 Erlang 或 Guile 代码,但确实让我可以灵活地做像 benchmark competing approaches that adhere to similar interfaces 这样的事情。

关于python - 你什么时候会使用 reduce() 而不是 sum()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33772092/

相关文章:

design-patterns - 策略模式的功能类比是什么?

Javascript创建函数以在其他函数之间共享变量

performance - 如何让我的 Haskell 程序更快?与C的比较

python - 如何分段弯杆进行角度计算?

python - 尽管遵循安装说明,Beaker 仍无法找到 Python 和 Julia 安装

python - 应用条件分组

python - 如何同时匹配多行和单行

list - 删除重复项但保留顺序

c++ - 为什么函数调用比根据 gprof 执行的代码花费的时间长得多?

java - 我需要使用 Visual VM 分析本地 Tomcat Java 应用程序,但分析选项卡被禁用