gpt4 book ai didi

python - 在多次调用的函数中完成一次昂贵的操作,Python 3

转载 作者:太空宇宙 更新时间:2023-11-04 00:10:40 25 4
gpt4 key购买 nike

我在 json 中有一长串组,我想要一个小工具:

def verify_group(group_id):
group_ids = set()
for grp in groups:
group_ids.add(grp.get("pk"))
return group_id in group_ids

显而易见的方法是在函数外部加载集合,或者声明一个全局变量——但假设我不需要全局变量。

在静态类型语言中,我可以说集合是静态的,我相信这会实现我的目标。如何在 python 中做类似的事情?即:第一次调用初始化集合 group_ids,后续调用使用第一次调用中初始化的集合。

顺便说一句,当我使用 profilestats 时包来分析这个小代码片段,我看到了这些可怕的结果:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
833 0.613 0.001 1.059 0.001 verify_users_groups.py:25(verify_group)
2558976 0.253 0.000 0.253 0.000 {method 'get' of 'dict' objects}
2558976 0.193 0.000 0.193 0.000 {method 'add' of 'set' objects}

我尝试添加 functools.lru_cache——但这种类型的优化并没有解决我目前的问题——我怎样才能加载集合 group_ids once inside def堵塞?

感谢您的宝贵时间。

最佳答案

static 没有等效项,但是您可以通过不同的方式实现相同的效果:

一种方法是滥用臭名昭著的可变默认参数:

def verify_group(group_id, group_ids=set()):
if not group_ids:
group_ids.update(grp.get("pk") for grp in groups)
return group_id in group_ids

然而,这允许调用者更改该值(这可能是您的功能或错误)。

我通常更喜欢使用闭包:

def make_group_verifier():
group_ids = {grp.get("pk") for grp in groups}
def verify_group(group_id):
# nonlocal group_ids # if you need to change its value
return group_id in group_ids
return verify_group

verify_group = make_group_verifier()

Python 是一种 OOP 语言。你描述的是一个实例方法。使用集合初始化类并调用实例上的方法。

class GroupVerifier:
def __init__(self):
self.group_ids = {grp.get("pk") for grp in groups}
def verify(self, group_id):
# could be __call__
return group_id in self.group_ids

我还想补充一点,这取决于 API 设计。如果他们需要性能,您可以让他们负责预先计算并提供值(value)。这是例如 random.choices 所做的选择。 . cum_weights 参数不是必需的,但它允许用户消除每次调用性能关键代码时计算该数组的成本。因此,您没有使用可变参数,而是使用 None 作为默认值,并且仅当传递的值为 None 时才计算该集合,否则您假设调用者为您完成了工作。

关于python - 在多次调用的函数中完成一次昂贵的操作,Python 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52559302/

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