2014-10-07 3 views
0

선장 돌이켜는에보고 : 주석과 대답을 통해 읽고 몇 가지 검사를 실행 한 후일반적인 성능 저하없이 파이썬에서 "함수 호출"할 수있는 방법이 있습니까?

, 나는 내 계산에 미묘한 실수를 한 것을 알아 냈다. 필자는 컴파일 된 조회를 해석 된 호출과 비교했다. 나는 비 IPython line magic 버전을 사용 전화를 미리 컴파일 할 때 (예 : timeit.timeit(codestr, setup_codestr), 나는 함수가 은 조회 :

지금 캐싱 기능의 전체 세계 거기에 같은 크기의 동일한 순서에 실제로 있었다 호출 발견 결과, 프리 컴파일 함수, 탐색 할 프리 컴파일 타입! 내가 그 이상한 질문처럼 들리 실현

하지만, 사람이 주위에 방법을 알고 있습니다, 그것은 좋은 것 : .. 그리고 그 후손을 위해 좋은 :)

입니다. 그래서 여기 간다 :

%%timeit somelist[42] 

가 그럼 난 90 나노초 범위에서 시간을 얻을 :

내가 좋아하는 뭔가를 할 경우. 슬라이스가 최대 190ish가됩니다. 그리고 나의 기분 좋은 놀람에, 심지어 큰 미쳤던 사람은 아직도 빨랐다. 이 나쁜 소년은, 예를 들어, 385 nanseconds의 무게 :

%%timeit some_nested_list[2:5][1][6:13] 

가 여기에 일입니다. 함수 호출은 그보다 훨씬 느리다. 나는 기능적으로 문제를 분해하는 것을 좋아하고 기능적 프로그래밍을 조금 더 생각하기 시작했다. 그러나 속도 차이는 상당하다 (3.34 마이크로 초 대 100-150 나노초 (현실적인 실제 조건문의 평균 등)).

def func(): 
    some_nested_list[2:5][1][6:13] 
%%timeit func() 

그래서, 기능 프로그래머 아마도 많은 거기 밖으로있다 : 다음은 3.34 마이크로 소요? 너 모두가이 작은 딸꾹질을 다뤄야 만했을거야? 누군가가 올바른 방향으로 나를 가르쳐 주나요?

+1

함수가 함수를 호출하여 정렬 할 수있는 인수를 사용하는 경우 (즉, 호출되면 결과가 캐시되고 이후 호출에서 캐시 된 결과가 반환되지만 원래 함수가 비싸면 도움이됩니다. 함수는 불변합니다 (즉, 동일한 인수가 매번 똑같은 결과를 나타냅니다). –

+0

@ TonySuffolk66 정말 고마워요. 올바른 방향으로 나를 가리켰습니다. – Inversus

답변

2

아니요. 파이썬 함수 호출은 스택 프레임을 설정하는 데 일정량의 오버 헤드를 필요로하며, 파이썬 함수를 작성하는 동안 그 오버 헤드를 제거 할 수는 없습니다. 귀하의 예제에서 작업이 빠르다 이유는 당신이 목록을하고있는 것입니다 및 목록은 C로 작성되어

명심해야 할

한가지는 많은 실제 상황에서, 함수 호출 오버 헤드 것, 그 함수가 실제로하는 것과 상대적으로 작아야합니다. 자세한 내용은 this question을 참조하십시오. 그러나 각 함수가 하나의 식만 평가하는 순수 함수 스타일로 이동하면 실제로 성능 저하가 발생할 수 있습니다.

대안은 빨리 많은 순수 파이썬 작업을하게 PyPy, 보는 것입니다. 함수 호출 속도가 구체적으로 향상되는지는 모르겠습니다. 또한 PyPy를 사용하면 사용할 수있는 라이브러리 집합을 제한 할 수 있습니다.

마지막으로, 당신은 기본적으로 파이썬과 같은 보이는 언어로 코드를 작성할 수 사이 썬,가, 실제로 어떤 경우에는 파이썬보다 훨씬 빠를 수 있습니다 C.이로 컴파일합니다.

결론은 당신의 기능을 빠르게하는 방법을하는 당신의 기능이 실제로 무엇에 달려 있다는 것입니다.파이썬에 관한 모든 것을 똑같이 유지하면서 모든 함수 호출을 마술처럼 빠르게 만드는 마법의 방법은 없습니다. 만약 있다면 이미 파이썬에 추가했을 것입니다.

+0

그래, 순수한 함수 스타일을 개발하려고하지 않습니다. 그러나 그 거룩한 탐구에 대한 증오는 없습니다. 나는 분해 능력과 속도 사이의 균형을 목표로하고 있지만, 함수를 호출하지 않아도되도록 코드를 작성해야하는 양을 즐기지 못했습니다. 그러나 나는 내 계산에 미묘한 오류가 있었다. 컴파일 된 조회를 해석 된 호출과 비교했다. 비 -IPython 매직 버전을 사용하여 호출을 미리 컴파일 할 때 sion (예 :'timeit.timeit (codestr, setup_codestr)'), 함수 호출이 실제로 같은 크기의 순서에 있다는 것을 알았습니다 :) – Inversus

+0

'ctypes'에 아름다운 마술이 있습니다. :) – Inversus

관련 문제