如何测量Python模块的import
加载时间/延迟AppEngine
?如何测量AppEngine中的Python导入加载时间/延迟
我希望收到此类报告:
module_name -> 1s
...
我已经实现/测试基于sys.path_hooks
和__import__
修补了一些解决方案,但它与纯Python的作品,但不是AppEngine
。
任何有经验的人都可以在AppEngine
/Python或纯Python中建议/分享一些提示吗?
如何测量Python模块的import
加载时间/延迟AppEngine
?如何测量AppEngine中的Python导入加载时间/延迟
我希望收到此类报告:
module_name -> 1s
...
我已经实现/测试基于sys.path_hooks
和__import__
修补了一些解决方案,但它与纯Python的作品,但不是AppEngine
。
任何有经验的人都可以在AppEngine
/Python或纯Python中建议/分享一些提示吗?
我发现这样的解决方案来跟踪App Engine上的时间 - 并非完全线程安全 - 您认为什么?
module.py
# coding=utf-8
## \authors Cezary K. Wagner
from threading import Lock
__indent = 0
__patched = False
def logImports():
global __patched
if __patched == True:
return
import time
import logging
# import inspect
import __builtin__
original__import__ = __builtin__.__import__
def patched__import__(name, *args):
global __indent
lock = Lock()
lock.acquire()
spaces = ' ' * (__indent * 2)
# callerFrame = inspect.currentframe().f_back
# moduleName = callerFrame.f_globals['__name__']
# lineNumber = callerFrame.f_lineno
# logging.debug('%simport start %s %s:%s.' % (spaces, name, moduleName, lineNumber))
__indent += 1
start = time.clock()
try:
module = original__import__(name, *args)
delta = time.clock() - start
# import could fail
finally:
lock.release
__indent -= 1
if delta >= 1.0:
logging.debug('%simport end %s in %ss' % (spaces, name, delta))
return module
__builtin__.__import__ = patched__import__
__patched = True
usage.py
from module import logImports
logImports()
import math
Google App Engine caches imports这可能是为path_hooks搞砸了。
由于导入的是缓存,它们通常不会在生产环境中引起任何重大问题。
问题是延迟与负载可能会导致**期限超过例外** 60年代以来时间限制 - 如你所说,如果**它加载它会很快** - 问题是加载延迟。 如果你使用很多模块可能会有问题,因为每个模块都可以做一些非惰性缓存(在需要之前准备数据)。 – Chameleon 2012-01-28 12:46:22
您仍然可以在本地进行测试,并且您将在本地执行的改进也会对服务器产生影响。 – 2012-01-28 19:10:20
当然是时间就是金钱,结果将会与生产服务器不同 - 不值得 - 我会这样做的解决方案... – Chameleon 2012-01-28 23:40:16