로컬 / 전역 가변 저장 시간 외에도 opcode 예측 기능으로 기능이 더 빨라집니다.
다른 답변에서 설명 하듯이 함수는 STORE_FAST
루프 에서 opcode를 사용합니다 . 함수 루프의 바이트 코드는 다음과 같습니다.
>> 13 FOR_ITER 6 (to 22) # get next value from iterator
16 STORE_FAST 0 (x) # set local variable
19 JUMP_ABSOLUTE 13 # back to FOR_ITER
일반적으로 프로그램이 실행될 때, 파이썬은 각 opcode를 하나씩 차례로 실행하여 스택을 추적하고 각 opcode가 실행 된 후 스택 프레임에서 다른 검사를 수행합니다. Opcode 예측은 특정 경우 Python이 다음 opcode로 직접 이동할 수 있으므로 이러한 오버 헤드를 피할 수 있음을 의미합니다.
이 경우, 파이썬이 볼 때마다 FOR_ITER
(루프의 상단), STORE_FAST
다음에 수행 할 opcode 를 "예측"합니다 . 그런 다음 파이썬은 다음 opcode를 들여다보고 예측이 정확하면 바로 건너 뜁니다.STORE_FAST
. 이것은 두 개의 opcode를 단일 opcode로 압축하는 효과가 있습니다.
반면, STORE_NAME
opcode는 글로벌 수준의 루프에서 사용됩니다. 파이썬은 *하지 않습니다 * 이 opcode를 볼 때 비슷한 예측을 . 대신, 루프가 실행되는 속도에 명백한 영향을 미치는 평가 루프의 맨 위로 돌아 가야합니다.
이 최적화에 대한 기술적 세부 사항을 제공하기 위해 ceval.c
파일 (Python 가상 머신의 "엔진") 에서 인용 한 내용은 다음과 같습니다.
일부 opcode는 쌍을 이루는 경향이 있으므로 첫 번째 코드가 실행될 때 두 번째 코드를 예측할 수 있습니다. 예를 들어
GET_ITER
종종 뒤에옵니다 FOR_ITER
. 그리고 FOR_ITER
종종 뒤에STORE_FAST
나 UNPACK_SEQUENCE
.
예측을 검증하는 것은 상수에 대한 레지스터 변수의 단일 고속 테스트 비용이 든다. 페어링이 양호하면 프로세서 자체의 내부 분기 예측이 성공할 가능성이 높으므로 다음 opcode로 거의 오버 헤드가 거의 발생하지 않습니다. 성공적인 예측은 예측할 수없는 두 가지 분기 인 HAS_ARG
테스트와 스위치 케이스를 포함하여 평가 루프를 통과하는 여행을 절약합니다 . 프로세서의 내부 분기 예측과 결합 PREDICT
하면 두 개의 opcode가 마치 본문이 결합 된 단일 새 opcode 인 것처럼 실행하는 효과가 있습니다.
FOR_ITER
opcode 의 소스 코드에서 정확히 예측 된 위치 를 확인할 수 있습니다 STORE_FAST
.
case FOR_ITER: // the FOR_ITER opcode case
v = TOP();
x = (*v->ob_type->tp_iternext)(v); // x is the next value from iterator
if (x != NULL) {
PUSH(x); // put x on top of the stack
PREDICT(STORE_FAST); // predict STORE_FAST will follow - success!
PREDICT(UNPACK_SEQUENCE); // this and everything below is skipped
continue;
}
// error-checking and more code for when the iterator ends normally
이 PREDICT
함수는 확장되어 if (*next_instr == op) goto PRED_##op
즉, 예측 된 opcode의 시작으로 점프합니다. 이 경우, 우리는 여기서 점프합니다 :
PREDICTED_WITH_ARG(STORE_FAST);
case STORE_FAST:
v = POP(); // pop x back off the stack
SETLOCAL(oparg, v); // set it as the new local variable
goto fast_next_opcode;
이제 로컬 변수가 설정되고 다음 opcode가 실행됩니다. 파이썬은 반복이 끝날 때까지 계속 반복하여 매번 성공적인 예측을합니다.
파이썬 위키 페이지는 CPython과의 가상 머신이 작동하는 방법에 대한 자세한 정보가 있습니다.