2010-01-03 2 views
1
def a(something): 
    return something*something 

#Case I - referencing 
b = a 
#Case II - creating a new function to call the first 
def b(something): 
    return a(something) 

어떤 스타일이 더 좋습니까? 그 중 하나에 단점이 있습니까?참조 함수 또는 다른 함수 만 호출하는 새 함수를 만드시겠습니까?

+3

왜 이름 대신에 이름을 언급하는 대신에이 중 하나를하고 싶습니까? – danben

+0

필자는 각 모듈이 특정 모듈을 구현해야하는 일종의 플러그인 유형을 만들고 있지만 대부분의 경우 작동 할 수있는 미리 준비된 모듈을 사용할 수 있습니다. –

답변

2

b = ab는 호출이 (NO 오버) 빠르다 의미하지만 내성 (예컨대 help(b))는 이름 aa의 참조 문을 보여줄 것이다. 후자의 문제가 특정 애플리케이션 (예를 들어, 일종의 튜토리얼)을위한 킬러가 아닌 한, 일반적으로 속도 이점이 이긴다.

이제

def a(something): 
    return something*something 

#Case I - referencing 
b1 = a 
#Case II - creating a new function to call the first 
def b2(something): 
    return a(something) 

: ref.py에

$ python -mtimeit -s'import ref' 'ref.a(23)' 
1000000 loops, best of 3: 0.716 usec per loop 
$ python -mtimeit -s'import ref' 'ref.b1(23)' 
1000000 loops, best of 3: 0.702 usec per loop 
$ python -mtimeit -s'import ref' 'ref.b2(23)' 
1000000 loops, best of 3: 0.958 usec per loop 

즉, b1 (순수 참조) 호출 그냥 빨리 a 호출 (실제로는 더 빨리이 실행의 2 %를 표시하지만, 그건 등 잘 측정의 "소음"내에서 b2 (내부적으로는 a이라고하는 완전히 새로운 기능)을 호출하면 20 %의 오버 헤드가 발생하지만 킬러는 아니지만 일반적으로 성능 희생으로 인해 특정 귀하의 유스 케이스에 중요합니다.

0

처음에는 새로운 기능을 생성하지 않으므로 개선되어야합니다.

0

함수 호출로 오버 헤드가 발생합니다. 케이스 I은 빠릅니다. 사례 II는 새로운 기능과 무관 한 기능을 만듭니다.

왜 사례 II가 필요합니까?

5

필요한 항목에 따라 다릅니다.

def a(something): 
    return something*something 

b = a 

def a(something): 
    return something+something 

>>> b(3) 
9 
>>> a(3) 
7 

반면에 당신이 한 경우 :

b = lambda x:a(x) 

B 그리고 당신은 당신이 원하는 경우 첫 번째 방법이 더 추가 함수 호출을 최적화하려는 경우 항상 같은

를 반환합니다 b와 a는 항상 같은 것을 반환합니다. 두 번째 방법이 더 좋습니다.

+1

... 그리고 나는 여분의 함수 호출이 대부분의 경우 최적화 가치가 있다고 생각하지 않는다. –

관련 문제