2013-04-26 2 views
0

현재 소프트웨어의 번역 부분을 최적화하는 중이며, 좌표는 x 번 번역됩니다. 현재 번역 코드는 translate 함수이고 translate_map 함수의 부분은 최적화되어 있습니다.Python : for 루프 대. 지도

내가 map 기능 대신 나는 아래의 테스트 케이스를 실행하면 루프가

C.

에서 수행되기 때문에 가능 for 루프로 사용하는 것을 here을 읽을 수는 map 기능은 실제로 for 표준보다 느리게 실행 고리. map이 기존의 for 루프보다 느리게 작동하는 이유는 무엇입니까? 번역 기능을 어떻게 더 빨리 실행할 수 있도록 최적화 할 수 있습니까?

import time 

def translate(atom_list): 
    for i in atom_list: 
     i[1]+=1 
     i[2]+=1 
     i[3]+=1 

atoms = [[1,1,1,1]]*1000 
start = time.time() 
for x in xrange(10000): 
    translate(atoms) 
print time.time() - start 


atoms = [[1,1,1,1]]*1000 
start = time.time() 
def translate_map(atom_list): 
    atom_list[1]+=1 
    atom_list[2]+=1 
    atom_list[3]+=1 
for x in xrange(10000): 
    map(translate_map,atoms) 
print time.time() - start 

출력 :

2.92705798149 
4.14674210548 
+2

numpy를 사용할 수없는 이유가 있습니까? – jamylak

+6

코드를 타이밍하기 위해'timeit' 모듈을 사용하십시오. –

+2

이러한 미세 최적화를 수행하는 대신 NumPy를 사용하십시오. 'map'은 아마도 10 %의 실행 시간을 절약 할 수 있지만 올바르게 사용될 경우 몇 배의 속도 향상을 줄 수 있습니다. –

답변

3

나는 당신이 당신의 map 구현보고있는 오버 헤드의 대부분을 의심은 함수 호출 오버 헤드에서 온다. translate 함수는 단일 루프 내에서 모든 작업을 수행하므로 전체 프로세스에 대해 하나의 함수 호출 만 있습니다. map으로 구현하면 목록의 모든 항목에 대해 별도의 함수 호출이 수행됩니다.

오버 헤드의 두 번째 소스 (비록 그것이 함수 호출과 비교하여 작은 것 같지만)는 map이 함수의 반환 값 목록을 생성한다는 것입니다. translate_map에는 return 문이 없으므로이 값은 모두 None입니다. Python 3에서는 map이 생성기이므로 map 호출 결과를 반복하지 않는 한 map 버전이 전혀 작동하지 않습니다. 명백한 루프가 훨씬 더 명확하기 때문에, 나는 그것에 충실 할 것이다. (만약 당신이 numpy을 가지 않는다면).

오, 그래, numpy이 훨씬 더 쉽게 (그리고 거의 확실하게 빨리도) 만들 것입니다 : 그것은

def translate(arr): # arr should be a numpy array 
    arr += 1 

의 그! 필요한 루프가 없습니다 (파이썬 수준에서).