python的延迟加载还是早期加载?
我们有以下代码示例:python的延迟加载还是早期加载?,python,performance,Python,Performance,我们有以下代码示例: big_static_data = { "key1" : { "subkey1" : "subvalue1", ... }, "key2" : ... } class StaticDataEarlyLoad: def __init__(self): self.static_data = big_static_data # other init def handle_use_id(s
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\u use\u id时,我们可能会遇到不同的性能问题
依我看,早期加载将在创建实例时加载数据,并将一直保存在内存中,直到实例被丢弃。对于延迟加载,在调用handle\u use\u id方法之前不会加载静态数据我说得对吗?(因为我不太清楚Python的内部结构,所以我不确定该实例将持续多长时间才能被废弃)。如果我是对的,早期加载意味着大内存需求,而晚期加载意味着每次调用该方法时都必须加载数据(开销很大?)
现在,我们是一个基于web的项目,所以应该选择哪一个作为最佳方法?(handle\u use\u id将被频繁调用。)
谢谢。在您的示例中,StaticDataLazyLoad(一旦init的语法正确)不会有太大的区别 导入模块时,“大静态数据”被初始化(“加载”)。无论是否创建了类的实例,它都会立即需要一些内存 StaticDataEarlyLoad的实例只会创建对大静态数据的新引用,而不是新副本 因此,StaticDataEarlyLoad中的查找可能会稍微快一些,因为数据是通过本地范围中的self引用的(查找“self”,然后查找“self.static_data”)
StaticDataLazyLoad中的查找不会在本地范围中找到“大静态数据”,python将在全局范围中查找并找到它。由于全局范围可能更大,因此此查找可能比“self.static_data”的查找花费更长的时间。在您的示例中,StaticDataLazyLoad(一旦init的语法正确)不会产生很大的差异 导入模块时,“大静态数据”被初始化(“加载”)。无论是否创建了类的实例,它都会立即需要一些内存 StaticDataEarlyLoad的实例只会创建对大静态数据的新引用,而不是新副本 因此,StaticDataEarlyLoad中的查找可能会稍微快一些,因为数据是通过本地范围中的self引用的(查找“self”,然后查找“self.static_data”)
StaticDataLazyLoad中的查找不会在本地范围中找到“大静态数据”,python将在全局范围中查找并找到它。由于全局范围可能更大,因此此查找可能需要比“self.static_data”的查找更长的时间。在文件开头创建一次big_static_数据(至少在您显示的代码中) 这会消耗内存 创建StaticDataEarlyLoad的实例时 StaticDataEarlyLoad()。静态数据是对大静态数据的引用。 它只消耗很少的内存。它只是指向大数据所指向的同一个字典。没有复制大的静态数据,也没有真正的“加载” 当实例StaticDataEarlyLoad()被垃圾收集时,会释放一点内存,但会保留大量静态数据 StaticDataLazyLoad做了很多相同的事情,但不创建属性
static\u data
。它只是直接引用大的静态数据。StaticDataEarlyLoad和StaticDataLazyLoad之间的内存消耗差异非常小。而且基本上不会有速度上的差异
最好明确说明类所依赖的内容。
StaticDataEarlyLoad
取决于大静态数据。
因此,您应该定义
class StaticDataEarlyLoad:
def __init__(self,static_data):
self.static_data = static_data
并使用StaticDataEarlyLoad(大静态数据)
初始化实例
这个定义和你发布的定义在速度上基本上没有区别。将依赖项放入
\uuuu init\uuuu
的调用签名中对于组织来说是一个好主意,毕竟您使用Python的OOP来很好地控制组织,对吗 big_static_数据在文件开头创建一次(至少在您显示的代码中)
这会消耗内存
创建StaticDataEarlyLoad的实例时
StaticDataEarlyLoad()。静态数据是对大静态数据的引用。
它只消耗很少的内存。它只是指向大数据所指向的同一个字典。没有复制大的静态数据,也没有真正的“加载”
当实例StaticDataEarlyLoad()被垃圾收集时,会释放一点内存,但会保留大量静态数据
StaticDataLazyLoad做了很多相同的事情,但不创建属性static\u data
。它只是直接引用大的静态数据。StaticDataEarlyLoad和StaticDataLazyLoad之间的内存消耗差异非常小。而且基本上不会有速度上的差异
最好明确说明类所依赖的内容。
StaticDataEarlyLoad
取决于大静态数据。
因此,您应该定义
class StaticDataEarlyLoad:
def __init__(self,static_data):
self.static_data = static_data
并使用StaticDataEarlyLoad(大静态数据)
初始化实例
这个定义和你发布的定义在速度上基本上没有区别。将依赖项放入
\uuuu init\uuuu
的调用签名中对于组织来说是一个好主意,毕竟您使用Python的OOP来很好地控制组织,对吗 没有特定的用例,就没有办法回答这个问题。多久使用一次?一天两次?一秒钟两次?在这个大型结构上调用的各种方法的比率是多少?没有关于如何使用它的具体、详细的配置文件,就没有“最好的”。这通常意味着它取决于用户的行为。我想如果用户登录的话会是每10秒一次。@Tower Joo:“非常频繁”没有任何意义。然而,每10秒一次意味着什么。没有特定的用例