纯函数优化
Pure functions optimization
pure function 是一个函数,其 return 值对于相同的参数是相同的,并且没有任何副作用。
CPython 是否识别出 return 值将是相同的并进行仅调用该函数一次的优化?如果没有,其他 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
总是有相同的 return 值。
标准 python 实现几乎没有优化用户代码。
但是您可以在纯函数上使用 lru cache 装饰器来获得您想要的功能。
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)
严格来说,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 的实现使用 capable of pure optimisations 的跟踪 JIT。请注意,这适用于低级操作(不一定是整个函数)并且仅适用于经常使用的代码。
pure function 是一个函数,其 return 值对于相同的参数是相同的,并且没有任何副作用。
CPython 是否识别出 return 值将是相同的并进行仅调用该函数一次的优化?如果没有,其他 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
总是有相同的 return 值。
标准 python 实现几乎没有优化用户代码。
但是您可以在纯函数上使用 lru cache 装饰器来获得您想要的功能。
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)
严格来说,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 的实现使用 capable of pure optimisations 的跟踪 JIT。请注意,这适用于低级操作(不一定是整个函数)并且仅适用于经常使用的代码。