Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的变化”;只运行一次函数;在Python 3中_Python_Function_Python 3.x - Fatal编程技术网

“的变化”;只运行一次函数;在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。注意:Python
import
语句使用
sys.modules
,即,如果
myrlib
是Python模块(按照您喜欢的方式实现(纯Python、C、Fortran等)),则同一模块的多个导入会很快。