2013-11-21 2 views
2

많은 수업이 있습니다. 그들 중 일부는 초기화가 느리고, cached properties을 사용하여 초기화 중 일부를 지연시키고 싶습니다. 첫 번째 단계는 범인을 식별하는 것입니다. 그래서 나는 다음과 같은 코드를 시간이 원하는 :타이밍 클래스 초기화에 대한 아이디어

class MyClass: 

    def __init__(self, ....): 
     # start measurement 
     ... 
     # end measurement, report 

내 요구 사항은 다음과 같습니다 로그 항목으로

  • 타이밍 결과. 나는 내 코드에 보관하지만, 플래그를 해제 할 수 있도록하려면
  • 가능한
  • 적은 침입

그래서 내 첫번째 생각은 일반적인 timeme 기능을 구현하는 것입니다 :

(시간 함수의 종류뿐만 아니라 클래스 메소드를 사용할 수있는) 그리고 지금 내가 할 수있는

def timeme(func):  
    def f(*args, **kwargs): 
     start = # get start timestamp 
     result = func(*args, **kwargs) 
     end = # get end timestamp 
     # report timespan 
     return result 
    return f 

:

class MyClass: 

    @timeme 
    def __init__(self, ....): 
    ... 

더 많은 것이 있습니까 pythonic 방법? 이것에 대한 몇 가지 표준 라이브러리 지원은 무엇입니까? 공구 지원? 이 접근법의 명백한 단점은 무엇입니까?

+1

하나의 단어가 마음에 온다 : // 프로파일 //. – MrGumble

+0

물론, 특정 분야에 집중하고 싶습니다. 완전하고 복잡한 프로파일 러 보고서는 필요 없습니다. 그리고 이것이 코드라면, 필자는 실생활 활동을하는 로그에서 프로파일 러를 사용하여 유스 케이스를 재현하는 것이 아니라, 실용적으로 사용할 수있게 할 수 있습니다. – dangonfast

답변

0

표준 프로파일 링의 경우 cProfile을 제외하고는 표준 라이브러리에 이와 비슷한 것은 없습니다.

일부 전역/환경 변수가 설정된 경우 __init__ 메서드를 래핑하는 간단한 메타 클래스를 만드는 것이 좋습니다. 그렇게하면 디버그/프로파일 링 데코레이터로 코드를 복잡하게 처리 할 필요가 없습니다.

그냥 출발점은 (그것을 테스트하지 않은) :

import functools 

# Python 3.3 for time.monotonic is required 
import time 

class TimedMeta(type): 
    timing_enabled = True 

    @classmethod 
    def _wrap_timeit(mcls, cls_name, meth): 
     @functools.wraps(meth) 
     def wrapped(*args, **kwargs): 
      start = time.monotonic() 
      try: 
       return meth(*args, **kwargs) 
      finally: 
       end = time.monotonic() 
       mcls._record_timing(cls_name, end - start) 

    @classmethod 
    def _record_timing(mcls, cls_name, timing): 
     raise NotImplementedError 

    def __new__(mcls, name, bases, dct): 
     if mcls.timing_enabled: 
      try: 
       init = dct['__init__'] 
      except KeyError: 
       pass 
      else: 
       dct['__init__'] = mcls._wrap_timeit(name, init) 

     return super().__new__(mcls, name, bases, dct) 

class Timed(metaclass=TimingMeta): 
    pass 

class Foo(Timed): 
    def __init__(self): 
     time.sleep(1.0) 
관련 문제