프로그래밍 언어/Python

[Python] globals() 딕셔너리와 global 키워드를 통한 참조의 시간 차이

바보1 2022. 4. 4. 23:24

재귀를 통한 피보나치 수열을 이용했습니다.

 

결론적으로 global 키워드를 통한 참조가 약 1.5초 정도 더 빨랐습니다.

 

 

import time

n = int(input())    


def fib1(n):
    if n <= 1:
        return n
    else:
        return fib1(n-1) + fib1(n-2)
        
      
s = time.time()  
print(fib1(n))
e = time.time()
print(e-s)

35를 입력했을 때, 2.83초가 나왔습니다.

 

이때 globals()와 global 키워드를 이용한 전역 변수의 시간 차이에 대해서 알아보겠습니다.

 

globals()를 사용했을 때)

코드)

import time

n = int(input())

globals()['count'] = 0


def fib1(n):
    globals()['count'] += 1
    if n <= 1:
        return n
    else:
        return fib1(n-1) + fib1(n-2)
        
        
s = time.time()  
print(fib1(n))
e = time.time()
print(e-s)
print(count)
35
9227465
6.252032041549683
29860703

아무것도 없었을 때보다 약 3.4초가 더 많이 걸리네요..

fib1 함수의 재귀 횟수는 29,860,703번입니다

 

이제 global 키워드를 통한 시간 차이를 알아보겠습니다.

 

global 키워드를 이용했을 때)

코드)

import time

n = int(input())    

count = 0


def fib1(n):
    global count
    count += 1
    if n <= 1:
        return n
    else:
        return fib1(n-1) + fib1(n-2)
        
        
s = time.time()  
print(fib1(n))
e = time.time()
print(e-s)
print(count)
35
9227465
4.770107984542847
29860703

어머나 세상에

 

4.77초네요?

 

 

  그냥 함수 globals() 딕셔너리 global 키워드를 통한 참조
시간 2.83초 6.25초 4.77초

 

물론 그냥 함수가 제일 좋긴하지만 ㅎㅎ...

전역 변수를 써야한다면 global 키워드를 통한 참조가 더 빠르네요

 

 

+추가)

방금 친구한테 자랑했는데, 친구가 당연하다는듯이 변수가 딕셔너리보다 작아서 그런거 아니냐고 말하네요..

저도 곰곰히 생각해보니까 맞는거 같습니다 ㅋㅋ;

근데 방금 또 생각났는데 global 키워드로 변수를 참조하면 그 global 변수를 메모리에 또 다시 적재해야하지 않나요?

근데 globals() 즉 전역 딕셔너리는 static 메모리에 있는 애가 아닌가요? 그래서 전 개인적으로 globals()가 좀 더 빠를거라 생각했는데..

암튼 그렇네요.

 

알아보고 다시 추가하겠습니다~

 

 

감사합니다.

 

 

 

지적 환영합니다.