재귀를 통한 피보나치 수열을 이용했습니다.
결론적으로 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()가 좀 더 빠를거라 생각했는데..
암튼 그렇네요.
알아보고 다시 추가하겠습니다~
감사합니다.
지적 환영합니다.
'프로그래밍 언어 > Python' 카테고리의 다른 글
[Vscode] Python Function annotation Theme is not Working (VScode에서 파이썬 타입 어노테이션, 함수 어노테이션, 타입 힌팅에 테마가 적용되지 않는 문제 해결법) (5) | 2022.06.12 |
---|---|
[Python] Python의 삼항연산자 (Python's Ternary operators) (0) | 2022.06.11 |
[Python] namespace와 함수 (전역변수의 참조와 변경, 그리고 오류가 나는 이유) (0) | 2022.05.07 |
[python] repr과 str의 차이 (0) | 2022.05.04 |
[Python] Intellisense와 Document 보이게 하는 법 (0) | 2022.05.03 |