2014-04-15 3 views
2

내가 파이썬의 구조체 팩/압축 풀기 성능을 테스트하고 함수 안에 넣어 경우는 속도거야 주목하고 있습니다 :파이썬 구조체 팩 속도까지 내부 기능

import time 
import struct 
from io import BytesIO 

def pack(b): 
    for i in range(10000000): 
     b.write(struct.pack('!i', i)) 

b = BytesIO() 
start = time.time() 
pack(b) 
end = time.time() 
print(end - start) 

b2 = BytesIO() 
start = time.time() 
for i in range(10000000): 
    b2.write(struct.pack('!i', i)) 
end = time.time() 
print(end - start) 

는 실행이

2.639040946960449 
3.0683419704437256 

을 제공합니다 코드는 동일하지만 기능이 빠릅니다.

왜 이런가요?

+0

이는 아마도 b에 대한 검색 때문일 수 있습니다. 함수 내에서 b는 매개 변수이며 런타임에서 로컬 객체 만 살펴 봐야하기 때문에 변수 찾아보기가 빠릅니다. 반면 함수 버전 외부에서는 b2가 전역 변수이므로 변수 이름 조회가 더 많은 단계를 거쳐야하고 더 오래 걸릴 수 있습니다. 함수 매개 변수 대신 b를 전역 변수로 지정하여 검사 할 수도 있습니다. 그렇게하면 성과가 훨씬 더 가까워 져야합니다. – toth

+0

@toth 그냥 'b'arg를 제거하고 define 함수 아래에 'global b'를 추가하면 속도가 느려지고 컴퓨터에서 ~ 2.70이되지만 직접 실행보다 빠릅니다. – lxyu

+0

흥미 롭다면 "i"를 글로벌하게 만들어야 할 것 같네요. – toth

답변

2

함수 내부 루프 글로벌 레벨에서 동일한 루프보다 빠르다 :

from timeit import default_timer as timer 

N = 10000000 

def f(): 
    for i in range(N): 
     pass 

start = timer() 
for i in range(N): 
    pass 
print("global %.2f" % (timer() - start,)) 

start = timer() 
f() 
print("function %.2f" % (timer() - start,)) 

출력 :

global 0.71 
function 0.40 

이것은 글로벌 대 속도의 차이에 의해 설명 될 수있다 CPython에서의 로컬 네임 스페이스 액세스.