2013-02-20 2 views
0

안녕하세요, 저는 여러 기능을 사용하여 더 빠른 R 스크립트를 작성하는 것과 관련하여 빠른 질문을했습니다 : 다음 중 어느 것이 더 빨리 실행될 것입니까? 기능이 서로의 외부 물건을 통과R 코드 작성을위한 모범 사례

function(args) 
{ 
function_using_previous_function_output(args) 
{ manipulation of arguments} 

} 

기능 즉 내 기능 :

function(args) 
{return(output} 
} 

function_using_previous_function_output(output) 
{ 
manipulation of arguments 
} 

이 중 스타일이나 최적화를위한 가장 좋은 방법은 거기를?

감사합니다.

+2

속도 차이는 어느 정도 보일 것입니다. 그러나 'microbenchmark' 또는 이와 유사한 방법으로 테스트하지 않으시겠습니까? –

답변

5

짧은 대답; 당신은 코드 최적화의 관점에서 잘못된 길을 찾고 있습니다.

긴 대답;

내용은 거의 항상 스크립트 성능의 가장 중요한 측면입니다. 코드가 이미 병렬화되고, 벡터화되고, Rcpp-ised 및 바이트 컴파일 (require (compiler), enableJIT (3))되고, 여전히이 더 많은 속도를 필요로하는 경우에만 구문을 바꿔야합니다. 당신이 속도를 얻기 위해 코드 자체의 모양을 변경해야하지 않을 경우

,이 기사는

http://www.r-bloggers.com/speeding-up-r-computations/ http://radfordneal.wordpress.com/2010/08/15/two-surpising-things-about-r/

원래의 질문에 대답하기 위해 당신의 친구입니다; system.time() 함수를 사용하여 효율성을 결정해야합니다. 통계적으로 유의미한 차이가 있음을 의심합니다.

+0

enableJIT (3)는 처음 입력 할 때 0을 반환하고 두 번째로 3을 반환하는 이유는 무엇입니까? – vitor

3

저는 생물학 모델의 다른 프로세스를 기반으로 여러 단계를 수행하는 많은 기능을 사용하는 시뮬레이션 패키지를 작성했습니다. 그런 다음 그 함수 자체가 main 함수에 의해 호출됩니다.이 함수는 호출을 통해 시뮬레이션을 수행하고 때로는 하위 함수의 출력을 통해 자체적으로 작업을 수행합니다. 요점은 함수의 함수에 크게 의존한다는 것입니다. 주된 시뮬레이션 기능에서 일련의 단계를 밟았을 때 속도 차이가별로 없었습니다. 그런 다음이를 정리하여 하위 단계로 옮깁니다. 그러나 각 하위 함수가 끝나면 하위 함수 중에 사용 된 변수 나 쓰레기가 있지만 하위 함수가 끝나면 return() '이 실제로 제거되지 않으므로 실수로 변수를 수정할 기회가 줄어들 기 때문에 선호합니다. 너는하고 싶지 않아. 일반적으로 R의 주된 속도 차이는 루프 연산이있을 때 벡터화하거나 Rcpp를 사용하여 C++에서 처리하는 경우입니다. R에있는 대부분의 핵심 내용은 현재 어쨌든 빠르며 이미 바이트 컴파일되어 있습니다.

+0

+1 많은 기능을 사용합니다. 함수의 계층 구조 (예 : 파일을 읽는 한 함수, 이전 함수를 사용하는 파일의 디렉토리를 읽는 한 함수)를 사용하면 코드를 더 쉽게 이해할 수 있으며 코드를 쉽게 다시 사용할 수 있습니다. 이 작은 빌딩 블록에서 새로운 기능을 창조하십시오. –