【发布时间】:2018-09-28 16:21:48
【问题描述】:
我在 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 包来分析这个小代码 sn-p 时,我看到了这些可怕的结果:
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 ——但这种类型的优化并不能解决我目前的问题——我如何才能在 inside def 后加载集合 group_ids堵塞?
感谢您的宝贵时间。
【问题讨论】:
-
没有测试,不过显然你可以存储它as a function attribute
-
这个问题解决了吗?
-
我会说“是”
-
嗯,在这里使用
lru_cache的明显方法是重构您的代码以拥有一个缓存 的def load_group_ids,然后从verify_group调用它跨度> -
@juanpa.arrivillaga 恕我直言,使用
lru_cache缓存没有参数的函数是用大炮射击苍蝇。
标签: python python-3.x optimization