from time import perf_counter import math from math import sin def timer(func): def inner(*args, **kwargs): t0 = perf_counter() func(*args, **kwargs) print(func.__name__, perf_counter() - t0) return inner @timer def test1(): for _ in range(5000000): math.sin(1) @timer def test2(): for _ in range(5000000): sin(1) @timer def test3(): sin_local = math.sin for _ in range(5000000): sin_local(1) test1() test2() test3() ''' test1 1.002921340001194 test2 0.791668149002362 test3 0.6878061269999307 '''




함수를 로컬변수에 저장해놓고 실행시킬 때가 가장 빠르고
그 다음이 함수를 명시적으로 import하는 경우
가장 느린 것이 모듈만 임포트 해놓고 필요할 때 불러오는 경우


파이썬에서 변수를 탐색할 때 먼저 locals() 배열에서 찾고 없으면 globals() 사전에서 찾음(test3 > test1, test2)

그리고 모듈만 임포트한 경우에는 globals() 사전에서 해당 모듈을 탐색한 이후, 다시 모듈 사전에서 해당 변수를 또 탐색해야 함(test2 > test1)


이 과정이 한두번하고 끝나면 상관 없지만 수없이 많이 실행되야하는 경우는 진지하게 고려할 필요가 ㄷㄷ