gpt4 book ai didi

python - 使用函数对象作为字典键

转载 作者:行者123 更新时间:2023-11-28 23:00:15 33 4
gpt4 key购买 nike

我正在使用函数对象作为字典键。我这样做是因为我需要缓存这些函数的结果。这大致是我正在使用的代码:

# module cache.py:
calculation_cache = {}
def cached(func):
# func takes input as argument
def new_function(input):
try:
result = calculation_cache[(func, input)]
except KeyError:
result = func(input)
calculation_cache[(func, input)] = result
return result
return new_function

# module stuff.py
@cached
def func(s):
# do something time-consuming to s
# ...
return result

我可以使用 func.__module__ + func.__name__ 而不是 func,但如果 func 工作正常,我宁愿使用它因为我担心可能的名称冲突(例如,lambda 函数或嵌套函数或被另一个同名函数替换的函数等)

这似乎工作正常,但我怀疑这可能会在一些难以测试的情况下导致问题。

例如,我担心一个函数被莫名其妙地删除,而另一个函数重用它的内存空间。在这种情况下,我的缓存将无效,但它不会知道。这是一个合理的担忧吗?如果有,有什么办法可以解决吗?

函数可以删除吗?重新加载模块是否将函数移动到新地址(从而更改其哈希值,并为新函数释放旧内存地址)?有人可以(出于某种奇怪的原因)简单地删除模块中定义的函数(再次使内存可用于新函数)吗?

如果只有使用 def 显式定义的函数才能安全,那么我可以禁止使用 cached 除了作为装饰器(我不知道如何执行它,但我可以将其记录在 cached 文档字符串中)。

最佳答案

我不确定我能否解决您上面的所有问题,但我可以解决其中的一个问题 --

我看不出有什么理由不能对函数进行垃圾回收。但是,由于您的函数是字典中的键,只要该字典存在,您函数的引用计数就永远不会达到零,也不会受到垃圾回收的影响。

我不知道模块的重新加载,但是,这似乎是一个你不应该真正需要担心的极端情况。模块并不是真的要重新加载...在某些情况下您可以这样做的事实主要是为了在交互式终端中进行调试,而不是为了在任何实际代码中使用.. .(据我所知...)

关于python - 使用函数对象作为字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12311711/

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