猿问

纯函数优化

纯函数是一个函数,它的返回值对于相同的参数是相同的,并且没有任何副作用。


CPython 是否认识到返回值将是相同的并且只调用一次函数进行优化?如果没有,其他python解释器会这样做吗?


下面我使用 编写了一个示例os.path.join,假设它是一个纯函数(我实际上并不知道它的实现),但问题扩展到所有纯函数。


dirpath = "C:\\Users"

dirname = "Username"


mylist = [["another\\directory", 6], ["C:\\Users\\Username", 8], ["foo\\bar", 3]]


count = 0


for pair in mylist:

    if os.path.join(dirpath, dirname) == pair[0]:

        count = pair[1]

dirpath并且dirname不会在 for 循环内进行修改。给定相同的输入,os.path.join总是有相同的返回值。


慕勒3428872
浏览 130回答 2
2回答

紫衣仙女

标准的 python 实现几乎没有对用户代码进行优化。但是,您可以在纯函数上使用lru 缓存装饰器来获得您想要的功能。from functools import lru_cachedef fib(n):&nbsp; &nbsp; """&nbsp; &nbsp; Calculate the n'th fibanaci number&nbsp; &nbsp; With O(N^2) <quadratic> runtime&nbsp; &nbsp; """&nbsp; &nbsp; if n < 2: return n&nbsp; &nbsp; return fib(n-1) + fib(n-2)@lru_cachedef fib2(n):&nbsp; &nbsp; """&nbsp; &nbsp; Calculate the n'th fibanaci number&nbsp; &nbsp; With O(N) <linear> runtime&nbsp; &nbsp; """&nbsp; &nbsp; if n < 2: return n&nbsp; &nbsp; return fib2(n-1) + fib2(n-2)

尚方宝剑之说

严格来说,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 。请注意,这适用于低级操作(不一定是整个函数),并且仅适用于常用代码。
随时随地看视频慕课网APP

相关分类

Python
我要回答