为了账号安全,请及时绑定邮箱和手机立即绑定

纯函数优化

纯函数优化

慕勒3428872 2022-10-18 17:40:47
纯函数是一个函数,它的返回值对于相同的参数是相同的,并且没有任何副作用。CPython 是否认识到返回值将是相同的并且只调用一次函数进行优化?如果没有,其他python解释器会这样做吗?下面我使用 编写了一个示例os.path.join,假设它是一个纯函数(我实际上并不知道它的实现),但问题扩展到所有纯函数。dirpath = "C:\\Users"dirname = "Username"mylist = [["another\\directory", 6], ["C:\\Users\\Username", 8], ["foo\\bar", 3]]count = 0for pair in mylist:    if os.path.join(dirpath, dirname) == pair[0]:        count = pair[1]dirpath并且dirname不会在 for 循环内进行修改。给定相同的输入,os.path.join总是有相同的返回值。
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

标准的 python 实现几乎没有对用户代码进行优化。

但是,您可以在纯函数上使用lru 缓存装饰器来获得您想要的功能。

from functools import lru_cache


def fib(n):

    """

    Calculate the n'th fibanaci number

    With O(N^2) <quadratic> runtime

    """

    if n < 2: return n

    return fib(n-1) + fib(n-2)


@lru_cache

def fib2(n):

    """

    Calculate the n'th fibanaci number

    With O(N) <linear> runtime

    """

    if n < 2: return n

    return fib2(n-1) + fib2(n-2)


查看完整回答
反对 回复 2022-10-18
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

严格来说,Python 没有纯函数。随时修改函数的含义是明确的。


>>> def add(a, b): return a + b

>>> def sub(a, b): return a - b

>>> add(10, 5)

15

>>> add.__code__ = sub.__code__

>>> add(10, 5)

5

此外,可以更改函数访问的builtins,和 闭包。globals


参考实现 CPython 没有基于函数的纯度进行优化。


PyPy 的实现使用能够进行纯优化的跟踪 JIT 。请注意,这适用于低级操作(不一定是整个函数),并且仅适用于常用代码。


查看完整回答
反对 回复 2022-10-18
  • 2 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信