선장 돌이켜는에보고 : 주석과 대답을 통해 읽고 몇 가지 검사를 실행 한 후일반적인 성능 저하없이 파이썬에서 "함수 호출"할 수있는 방법이 있습니까?
, 나는 내 계산에 미묘한 실수를 한 것을 알아 냈다. 필자는 컴파일 된 조회를 해석 된 호출과 비교했다. 나는 비
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 마이크로 소요? 너 모두가이 작은 딸꾹질을 다뤄야 만했을거야? 누군가가 올바른 방향으로 나를 가르쳐 주나요?
함수가 함수를 호출하여 정렬 할 수있는 인수를 사용하는 경우 (즉, 호출되면 결과가 캐시되고 이후 호출에서 캐시 된 결과가 반환되지만 원래 함수가 비싸면 도움이됩니다. 함수는 불변합니다 (즉, 동일한 인수가 매번 똑같은 결과를 나타냅니다). –
@ TonySuffolk66 정말 고마워요. 올바른 방향으로 나를 가리켰습니다. – Inversus