“的变化”;只运行一次函数;在Python 3中
我正在使用“的变化”;只运行一次函数;在Python 3中,python,function,python-3.x,Python,Function,Python 3.x,我正在使用rpy2通过该模块提供的importr函数在Python中包装R库(Python语言中的模块) 问题是,importr在运行时可能非常昂贵(调用时它会做很多事情),我希望只调用一次(对于每个importr调用,我都有几个使用其结果的函数,同时我不能将所有内容都放在模块的顶部,否则导入时间会显著减慢) 目前,对于我使用importr的每个模块,我会: myrlib = None def do_stuff_with_r(param): global myrlib if m
rpy2
通过该模块提供的importr
函数在Python中包装R库(Python语言中的模块)
问题是,importr
在运行时可能非常昂贵(调用时它会做很多事情),我希望只调用一次(对于每个importr
调用,我都有几个使用其结果的函数,同时我不能将所有内容都放在模块的顶部,否则导入时间会显著减慢)
目前,对于我使用importr
的每个模块,我会:
myrlib = None
def do_stuff_with_r(param):
global myrlib
if myrlib is None:
myrlib = importr(myrlib)
我想概括一下,因为我在许多不同的模块中进行这种操作,因此这些行都是重复的
但是,我不确定如何执行此操作:在第一次调用后返回None,这不是我真正想要做的。假设这是可行的,我如何确保只调用一次特定参数的
importr()
?您可以编写自己的包装函数来缓存导入结果:
def import_r(lib, cache={}):
if lib not in cache:
cache[lib] = importr(lib)
return cache[lib]
每次你想用importr时就用它来代替?想用,但我不得不等到计时器用完。@Einar:为了避免不必要的查找
ret=cache.get(lib)\n如果ret为None:ret=cache[lib]=importr(lib)\n返回ret
。一般(可能更慢)版本是functools.lru_cache()
decorator。注意:Pythonimport
语句使用sys.modules
,即,如果myrlib
是Python模块(按照您喜欢的方式实现(纯Python、C、Fortran等)),则同一模块的多个导入会很快。