代码之家  ›  专栏  ›  技术社区  ›  guidoism

如何测量python导入延迟

  •  2
  • guidoism  · 技术社区  · 14 年前

    我的django应用程序需要永远加载,所以我想找到一种方法来测量导入延迟,这样我就可以找到有问题的模块并使其延迟加载。

    有没有明显的方法可以做到这一点?我正在考虑调整import语句本身以产生延迟,但我不确定具体怎么做。我想最好有导入树(或DAG?)除了延迟之外,仅仅列出延迟和导入语句就足够了。

    1 回复  |  直到 14 年前
        1
  •  7
  •   Alex Martelli    14 年前

    你可以重新定义 the __import__ built-in function 记录开始和结束时间(将其他所有内容委托给原始内置 进口商品 )就是这样 这个 在python中“调整import语句”的方法:重定义 进口商品 !

    编辑 :下面是一个简单的例子…:

    import sys
    
    import __builtin__
    _orgimp = __builtin__.__import__
    
    import logging
    FORMAT = "%(asctime)-15s %(message)s"
    logging.basicConfig(format=FORMAT, level=logging.INFO)
    
    def __import__(name, *a):
      r = sys.modules.get(name)
      if r is not None: return r
      logging.info('import bgn %s', name)
      r = _orgimp(name, *a)
      logging.info('import end %s', name)
      return r
    __builtin__.__import__ = __import__
    
    import pyparsing
    

    这在我的系统上显示:

    2010-08-24 08:36:39,649 import bgn pyparsing
    2010-08-24 08:36:39,652 import bgn weakref
    2010-08-24 08:36:39,652 import bgn _weakref
    2010-08-24 08:36:39,653 import end _weakref
    2010-08-24 08:36:39,653 import end weakref
    2010-08-24 08:36:39,654 import bgn copy
    2010-08-24 08:36:39,655 import bgn org.python.core
    2010-08-24 08:36:39,656 import end copy
    2010-08-24 08:36:39,675 import end pyparsing
    

    当然,您可以解析这个日志来显示嵌套(哪个模块首先导入了哪些其他模块) “尝试导入”失败(此处为 org.python.core copy 毫无疑问,在 try / except 语句)以及每次导入开始和结束的时间(后者仅当它确实结束时,当然,如果失败则不是——很容易调整 尝试 / finally 或者任何你喜欢的行为!-)