2012-02-14 5 views
2

파이썬으로 작성하는 기존 코드에서 각 함수 또는 변수의 호출 시간을 가져오고 싶습니다.함수 또는 변수가 호출되는 횟수를 계산하십시오.

acc = {} 

class object(object): 
    def __getattribute__(self, p): 
     acc.update({str(self) + p: acc.get(str(self) + p, 0) + 1}) 
     return supe(object, self).__getattribute__(p) 

class A(object): 
    def a(self): 
     pass 

class B(A): 
    def b(self): 
     pass 

def main(): 
    a = A() 
    a.a() 
    b = B() 
    b.b() 
    b.a = 'a' 
    b.a 

    print acc 
if __name__ == '__main__': 
    main() 

을하지만, 그것은 단지 객체의 기능과 변수를 계산할 수있다, 나는 정상적인 기능이나 변수를 계산하는 방법을, 같은 : 내가 생각했던

는 다음과 같이 개체의 의 getAttribute 함수를 재정의하다 로 : 나는이 같은 결과를 얻으려면

def fun1(): 
    pass 
fun1() 
fun1() 

, 그것을 할 수있는 도구 나 방법이있다?

미안하지만 영어가 정말 필요합니다. 런타임에 실행 시간이 아니라 호출 시간이 필요합니다. 위와 같은 , fun1()이 두 번 호출됩니다.

+4

'클래스 객체 (객체) - 정말 :

이 가능하지 않음 (위 달리) 테스트 된 예,하지만 따라 뭔가를 시도? –

+0

네, 제 생각 엔 제 바보 같은 방법을 잊어주십시오. – flreey

+0

어떻게 변수 호출을 계산합니까? – Marii

답변

2

decorator을 사용하십시오.

>>> def timestamp(container, get_timestamp): 
...  def timestamp_decorator(func): 
...   def decorated(*args, **kwargs): 
...    container[func.func_name] = get_timestamp() 
...    return func(*args, **kwargs) 
...   return decorated 
...  return timestamp_decorator 
... 

그리고 당신은 다음과 같이 사용 :

>>> import datetime 
>>> def get_timestamp(): 
...  return datetime.datetime.now() 
... 
>>> timestamps = {} 
>>> @timestamp(timestamps, get_timestamp) 
... def foo(a): 
...  return a * 2 
... 
>>> x = foo(2) 
>>> print x, timestamps 
4 {'foo': datetime.datetime(2012, 2, 14, 9, 55, 15, 789893)} 
+0

코드가 alredy로 작성되었습니다. 모든 함수에 데코레이터를 추가하고 싶지는 않지만 변수를 어떻게 추가할까요? – flreey

+0

@flreey, hmmm ... 그것에 대해 생각할 것입니다. – senderle

+0

죄송합니다. 내 질문에 실수가 있습니다. 실제로 얼마나 많은 함수가 호출되었는지 알고 싶습니다. 예를 들어, a = A(); 재미있는 것(); a.f() 그리고 결과를 얻고 싶습니다.재미는 두 번 호출합니다. – flreey

0

(타임 스탬프 장식 nbot) 함수에 대한 카운터 장식을 만들 수있는 - 그리고 자동으로 주어진 모든 기능을 래핑하는 방법이있을 것 이 데코레이터 모듈 - 당신이 함수를 계산하려는 모듈에서 "인 MyModule"라는 호출하는 경우

그래서, 당신은 쓸 수 있습니다 :

class function_counter(object): 
    def __init__(self, func): 
     self.counter = 0 
     self.func = func 

    def __call__(self, *args, **kw): 
     self.counter += 1 
     return self.func(*args, **kw) 

그리고 : 기능 사용을 카운트 할 것

import mymodule 
from types import FunctionType, BuiltinFunctionType 
# define the "function_counter" class as above here (or import it) 

for key, value in mymodule.__dict__.items(): 
    if isinstance(value, (FunctionType, BuiltinFunctionType)): 
     mymodule.__dict__[key] = function_counter(value) 

:

>>> @function_counter 
... def bla(): 
...  pass 
... 
>>> 
>>> bla() 
>>> bla() 
>>> bla() 
>>> bla.counter 
3 

이 모듈의 모든 기능이 적용하려면, 당신은 뭔가를 쓸 수 있습니다. 모듈 수준의 변수 사용량을 계산하려면 처럼 모듈 객체에서 메커니즘 속성 검색을 오버라이드 할 수 없으므로 예제에서 클래스에 대해 수행 한 것처럼 쉽게 할 수 있습니다.

거기에가는 방법은 모듈을 가져온 후에 속성 계산 방법을 구현하는 클래스를 모듈로 대체하고 모듈 속성을 인스턴스 속성에 할당하도록하는 것입니다. 이 클래스. `

import mymodule 

from types import FunctionType 

class Counter(object): 
    # counter __getattribute__ just as you did above 

c = Counter() 
for key, value in mymodule.__dict__.items(): 
    setattr(c, key, staticmethod(value) if isinstance(value, FunctionType) else value) 
mymodule = c 
+0

나는 당신의 방법을 시험한다, 나가 mymodule를 수입 할 때 정의 된 기능의 수만 얻는다. 그리고 실제로 필요한 것은 런타임에 함수 또는 변수가 호출되는 횟수를 계산할 수있는 것과 같습니다. – flreey

관련 문제