【问题标题】:Variation of "running a function only once" in Python 3Python 3 中“只运行一次函数”的变体
【发布时间】:2014-10-06 08:09:05
【问题描述】:

我正在使用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)

我想概括一下,因为我在许多不同的模块中执行这种操作,因此这些行都是重复的。

但是我不确定如何执行此操作:this solution 在第一次调用后返回 None,这并不是我真正想做的。假设这是可行的,我如何确保特定参数的 importr() 只被调用一次?

【问题讨论】:

  • 注意:Python import 语句使用 sys.modules 即,如果 myrlib 是 Python 模块(以您喜欢的方式实现(纯 Python、C、Fortran 等)),则可以多次导入相同的模块很快。

标签: python function python-3.x


【解决方案1】:

您可以编写自己的包装函数来缓存导入的结果:

def import_r(lib, cache={}):
    if lib not in cache:
        cache[lib] = importr(lib)
    return cache[lib]

并且每次您想使用 importr 时都使用它?

【讨论】:

  • 想要,但我不得不等到计时器用完。 ;)
  • @Einar:避免不必要的查找ret = cache.get(lib) \n if ret is None: ret = cache[lib] = importr(lib); \n return ret。一般(可能更慢)版本是functools.lru_cache() decorator。
猜你喜欢
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
相关资源
最近更新 更多