첫 번째 코드는 입니다. request
및 해당 특성의 모든 조회를 피하기 때문에 더 빠릅니다.
In [6]: dis.dis(test_first)
2 0 LOAD_GLOBAL 0 (request)
3 LOAD_ATTR 1 (session)
6 STORE_FAST 0 (session)
3 9 LOAD_CONST 1 (1)
12 LOAD_FAST 0 (session)
15 LOAD_CONST 2 ('v1')
18 STORE_SUBSCR
4 19 LOAD_CONST 3 (2)
22 LOAD_FAST 0 (session)
25 LOAD_CONST 4 ('v2')
28 STORE_SUBSCR
5 29 LOAD_CONST 5 (3)
32 LOAD_FAST 0 (session)
35 LOAD_CONST 4 ('v2')
38 STORE_SUBSCR
6 39 LOAD_FAST 0 (session)
42 LOAD_CONST 2 ('v1')
45 BINARY_SUBSCR
46 LOAD_CONST 1 (1)
49 COMPARE_OP 2 (==)
52 POP_JUMP_IF_FALSE 68
7 55 LOAD_CONST 6 (4)
58 LOAD_FAST 0 (session)
61 LOAD_CONST 7 ('v4')
64 STORE_SUBSCR
65 JUMP_FORWARD 0 (to 68)
>> 68 LOAD_CONST 0 (None)
71 RETURN_VALUE
대 : 바이트 코드의 차이를 참조하십시오
In [7]: dis.dis(test_second)
2 0 LOAD_CONST 1 (1)
3 LOAD_GLOBAL 0 (request)
6 LOAD_ATTR 1 (session)
9 LOAD_CONST 2 ('v1')
12 STORE_SUBSCR
3 13 LOAD_CONST 3 (2)
16 LOAD_GLOBAL 0 (request)
19 LOAD_ATTR 1 (session)
22 LOAD_CONST 4 ('v2')
25 STORE_SUBSCR
4 26 LOAD_CONST 5 (3)
29 LOAD_GLOBAL 0 (request)
32 LOAD_ATTR 1 (session)
35 LOAD_CONST 4 ('v2')
38 STORE_SUBSCR
5 39 LOAD_GLOBAL 0 (request)
42 LOAD_ATTR 1 (session)
45 LOAD_CONST 2 ('v1')
48 BINARY_SUBSCR
49 LOAD_CONST 1 (1)
52 COMPARE_OP 2 (==)
55 POP_JUMP_IF_FALSE 74
6 58 LOAD_CONST 6 (4)
61 LOAD_GLOBAL 0 (request)
64 LOAD_ATTR 1 (session)
67 LOAD_CONST 7 ('v4')
70 STORE_SUBSCR
71 JUMP_FORWARD 0 (to 74)
>> 74 LOAD_CONST 0 (None)
77 RETURN_VALUE
공지 사항을 모든 여분의 LOAD_GLOBAL
두 번째 바이트 코드에 LOAD_ATTR
및 LOAD_FAST
는 않기 때문에, LOAD_FAST
이 LOAD_GLOBAL
보다 훨씬 빠르다는 것을 염두에 두어야 간단한 배열 조회, LOAD_GLOBAL
은 전역 사전 (변수의 해시 계산 등이 필요함)을 조회해야합니다.
첫 번째 버전은 하나의 LOAD_GLOBAL
과 하나의 LOAD_ATTR
입니다. 우리는 그들의 속도를 테스트
그리고 실제로 경우 :
In [8]: %timeit test_first()
1000000 loops, best of 3: 343 ns per loop
In [9]: %timeit test_second()
1000000 loops, best of 3: 542 ns per loop
첫 번째는 거의 두 배 빠릅니다. 그러나 속도는 모두 빠르며 아마도 속도는 중요하지 않습니다. request
이 로컬 변수 인 경우 속도 차이가 조금 줄어 듭니다.
두 번째 단점은 다른 단점이 있습니다. 동일한 일을 여러 번 반복합니다. 코드를 더 크고, 읽기 어렵게 만들고, 오타가 발생할 확률이 높아졌습니다. 이것은 내가 생각하기에, 그 단편의 중요한 것입니다. 성능상의 이유로 선택하는 경우 : 너무 성급한 최적화입니다.
컴퓨터에서 일부 테스트를 실행하십시오! 이러한 것들이 큰 루프에서 실행되지 않는다면 어떤 종류의 성능 차이도 볼 수 있을지는 의문입니다. 속성 조회가 파이썬에서 얼마나 비쌉니까? – dm03514