Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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的延迟加载还是早期加载?_Python_Performance - Fatal编程技术网

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秒一次意味着什么。没有特定的用例