如何測量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