Skip to main content
 首页 » 编程设计

python之python 的延迟加载或早期加载

2025年05月04日18kerrycode

我们有以下代码示例:

big_static_data = { 
  "key1" : { 
     "subkey1" : "subvalue1", 
     ... 
     }, 
  "key2" :  
   ... 
} 
class StaticDataEarlyLoad: 
    def __init__(self): 
        self.static_data = big_static_data 
        # other init 
    def handle_use_id(self, id): 
        return complex_handle(self.static_data, id) 
    ... 
class StaticDataLazyLoad: 
    def __init__(self): 
        # not init static data 
        # other init 
    def handle_use_id(self, id): 
        return complex_handle(big_static_data, id) 
    ... 

正如上面的代码所说,每当我们调用实例的handle_use_id时,我们可能会遇到不同的性能问题。

IMO,早期加载将在创建实例时加载数据,并将在内存中直到实例被垃圾化。对于延迟加载,在我们调用 handle_use_id 方法之前不会加载静态数据。 我说得对吗?(因为我不太清楚 Python 的内部结构,所以我不确定该实例在垃圾处理之前会持续多久)。如果我是对的,提前加载意味着需要大量内存,而延迟加载意味着我们每次调用方法时都必须加载数据(开销很大?)

现在,我们是一个基于网络的项目,那么应该选择哪种方法作为最佳方法?(handle_use_id 将被频繁调用。)

谢谢。

请您参考如下方法:

在您的示例中,StaticDataLazyLoad(一旦 init 的语法正确)不会产生很大的不同。

“big_static_data”在导入模块时被初始化(“加载”)。无论是否创建类的实例,它都会立即需要一些内存。

StaticDataEarlyLoad 的实例只会创建对 big_static_data 的新引用,而不是新副本。

因此,在 StaticDataEarlyLoad 中查找可能会稍微快一些,因为数据是通过本地范围内的 self 引用的(查找“self”,然后查找“self.static_data”)。

在 StaticDataLazyLoad 中查找不会在本地范围内找到“big_static_data”,python 将在全局范围内查找并找到它。由于全局范围可能更大,因此此查找可能比“self.static_data”的查找花费更长的时间。