이것은 며칠 전에 답한 답에 대한 후속 질문 입니다. 편집 : 해당 질문의 OP는 이미 동일한 질문 을하기 위해 그에게 게시 한 코드를 사용 했지만 알지 못했습니다. 사과. 제공되는 답변은 다릅니다!
실질적으로 나는 다음을 관찰했다.
>>> def without_else(param=False):
... if param:
... return 1
... return 0
>>> def with_else(param=False):
... if param:
... return 1
... else:
... return 0
>>> from timeit import Timer as T
>>> T(lambda : without_else()).repeat()
[0.3011460304260254, 0.2866089344024658, 0.2871549129486084]
>>> T(lambda : with_else()).repeat()
[0.27536892890930176, 0.2693932056427002, 0.27011704444885254]
>>> T(lambda : without_else(True)).repeat()
[0.3383951187133789, 0.32756996154785156, 0.3279120922088623]
>>> T(lambda : with_else(True)).repeat()
[0.3305950164794922, 0.32186388969421387, 0.3209099769592285]
또는 다른 말로하면 else
, if
트리거 되는 조건에 관계없이 절을 갖는 것이 더 빠릅니다 .
나는 그것이 두 바이트에 의해 생성 된 다른 바이트 코드와 관련이 있다고 가정하지만, 아무도 상세하게 확인 / 설명 할 수 있습니까?
편집 : 모든 사람이 내 타이밍을 재현 할 수있는 것은 아니므로 시스템에 대한 정보를 제공하는 것이 유용 할 것이라고 생각했습니다. 기본 파이썬이 설치된 상태에서 Ubuntu 11.10 64 비트를 실행하고 있습니다. python
다음 버전 정보를 생성합니다.
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
다음은 Python 2.7에서 디스 어셈블 한 결과입니다.
>>> dis.dis(without_else)
2 0 LOAD_FAST 0 (param)
3 POP_JUMP_IF_FALSE 10
3 6 LOAD_CONST 1 (1)
9 RETURN_VALUE
4 >> 10 LOAD_CONST 2 (0)
13 RETURN_VALUE
>>> dis.dis(with_else)
2 0 LOAD_FAST 0 (param)
3 POP_JUMP_IF_FALSE 10
3 6 LOAD_CONST 1 (1)
9 RETURN_VALUE
5 >> 10 LOAD_CONST 2 (0)
13 RETURN_VALUE
14 LOAD_CONST 0 (None)
17 RETURN_VALUE
LOAD_CONST(None); RETURN_VALUE
그러나 명시된 바와 같이 도달하지 못했습니다) with_else
. 데드 코드가 기능을 더 빨리 만든다고 의심합니다. 누군가 dis
2.7을 제공 할 수 있습니까?
else
과 함께 기능 하고 False
가장 느리다 (152ns). 두 번째로 빠른했다 True
없이 else
(143ns) 등이 기본적으로 (137ns와 138ns) 동일 하였다. 기본 매개 변수를 사용하지 않고 %timeit
iPython에서 측정했습니다 .
with_else
빠릅니다.