2012-01-28 70 views
0

如何測量Python模塊的import加載時間/延遲AppEngine如何測量AppEngine中的Python導入加載時間/延遲

我希望收到此類報告:

module_name -> 1s 
... 

我已經實現/測試基於sys.path_hooks__import__修補了一些解決方案,但它與純Python的作品,但不是AppEngine

任何有經驗的人都可以在AppEngine/Python或純Python中建議/分享一些提示嗎?

回答

0

我發現這樣的解決方案來跟蹤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 
1

Google App Engine caches imports這可能是爲path_hooks搞砸了。
由於導入的是緩存,它們通常不會在生產環境中引起任何重大問題。

+0

問題是延遲與負載可能會導致**期限超過例外** 60年代以來時間限制 - 如你所說,如果**它加載它會很快** - 問題是加載延遲。 如果你使用很多模塊可能會有問題,因爲每個模塊都可以做一些非惰性緩存(在需要之前準備數據)。 – Chameleon 2012-01-28 12:46:22

+0

您仍然可以在本地進行測試,並且您將在本地執行的改進也會對服務器產生影響。 – 2012-01-28 19:10:20

+0

當然是時間就是金錢,結果將會與生產服務器不同 - 不值得 - 我會這樣做的解決方案... – Chameleon 2012-01-28 23:40:16