gpt4 book ai didi

Python 相当于 Scala 的 lazy val

转载 作者:太空狗 更新时间:2023-10-30 00:33:00 24 4
gpt4 key购买 nike

我目前正在尝试将一些 Scala 代码移植到 Python 项目中,我遇到了以下 Scala 代码:

  lazy val numNonZero = weights.filter { case (k,w) => w > 0 }.keys

weights 是一个非常长的项目元组列表及其关联的概率权重。经常从该列表中添加和删除元素,但检查有多少元素具有非零概率的情况相对较少。在我正在移植的代码中还有其他一些像这样的罕见但昂贵的操作,它们似乎从 lazy val 的使用中受益匪浅。执行类似于 Scala 的 lazy val 的事情的最惯用的 Python 方法是什么?

最佳答案

在 Scala 中,lazy val 是一个 final 变量,它在首次访问时计算一次,而不是在声明时计算一次。它本质上是一个 memoized没有参数的函数。这是您可以在 Python 中实现内存装饰器的一种方法:

from functools import wraps

def memoize(f):
@wraps(f)
def memoized(*args, **kwargs):
key = (args, tuple(sorted(kwargs.items()))) # make args hashable
result = memoized._cache.get(key, None)
if result is None:
result = f(*args, **kwargs)
memoized._cache[key] = result
return result
memoized._cache = {}
return memoized

下面是它的使用方法。使用 property,您甚至可以删除空括号,就像 Scala 一样:

>>> class Foo:
... @property
... @memoize
... def my_lazy_val(self):
... print "calculating"
... return "some expensive value"

>>> a = Foo()
>>> a.my_lazy_val
calculating
'some expensive value'

>>> a.my_lazy_val
'some expensive value'

关于Python 相当于 Scala 的 lazy val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18142919/

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