gpt4 book ai didi

Python函数评估效率

转载 作者:太空狗 更新时间:2023-10-30 01:43:01 25 4
gpt4 key购买 nike

如果我这样做:

x=[(t,some_very_complex_computation(y)) for t in z]

显然 some_very_complex_computation(y) 不依赖于 t。所以它应该只被评估一次。有没有办法让 Python 意识到这一点,这样它就不会在每次迭代时都计算 some_very_complex_computation(y)?

编辑:我真的很想在一行中做到这一点......

最佳答案

通常你应该听从 San4ez 的建议,在这里只使用一个临时变量。我仍然会介绍一些在某些情况下可能有用的技术:

一般来说,如果您只想为子表达式绑定(bind)一个名称(这通常是您需要临时变量的原因),您可以使用 lambda:

x = (lambda result=some_very_complex_computation(y): [(t, result) for t in z])()

在这种特殊情况下,以下是一个非常干净且可读的解决方案:

x = zip(z, itertools.repeat(some_very_complex_computation(y)))

关于此类自动优化的一般说明

在像 Python 这样的动态语言中,实现将很难确定 some_very_complex_computation引用透明的,也就是说,它总是返回相同参数的相同结果。如果你想要这样的魔法,你可能想研究像 Haskell 这样的函数式语言。

“明确”的纯粹性:内存

不过,您可以做的是让some_very_complex_computation显式缓存最近参数的返回值:

from functools import lru_cache

@lru_cache()
def some_very_complex_computation(y):
# ...

这是 Python 3。在 Python 2 中,您必须自己编写装饰器:

from functools import wraps

def memoize(f):
cache = {}
@wraps(f)
def memoized(*args):
if args in cache:
return cache[args]
res = cache[args] = f(*args)
return res
return memoized

@memoize
some_very_complex_computation(x):
# ...

关于Python函数评估效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10259342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com