인터프리터가 유지 관리하는 정수 캐시는 무엇인가요?
Python은 동일한 리터럴을 동일한 코드 객체로 컴파일할 때 동일한 리터럴을 최적화하여 객체를 생성합니다. 동일한 정체성을 가지고 있습니다. 일반적으로 [-5, 256] 범위 내의 정수가 캐시되지만 이것이 이 범위 내의 모든 정수가 동일한 ID를 갖는다는 것을 보장하지는 않습니다.
제공한 예제 코드에서 각 줄을 실행할 때 Python 셸에서 별도로:
>>> a = 1 >>> b = 1 >>> a is b True
코드는 각 줄마다 별도로 구문 분석되고 컴파일됩니다. 그러나 파일에서 동일한 코드를 함께 실행하면
>>> a = 257; b = 257; a is b True
컴파일러가 리터럴을 최적화할 수 있습니다. 컴파일 프로세스 중에 AST는 바이트코드로 변환되고 컴파일러는 리터럴의 사용을 분석하여 중복을 방지합니다. 이로 인해 컴파일된 코드에서 정수 257에 대한 단일 상수가 생성됩니다.
이 최적화는 정수에만 국한되지 않고 부동 소수점과 같은 다른 리터럴에도 적용됩니다. 그러나 튜플 내부 리터럴이 별도로 최적화되는 튜플과 같은 더 복잡한 리터럴에는 작동하지 않습니다.
두 개의 PyInt_Object가 생성되는 것을 관찰한 이유는 리터럴을 정수로 변환하는 파서의 접근 방식 때문일 가능성이 높습니다. . 파서는 리터럴을 정수 값으로 변환한 다음 PyLong_FromString을 호출하여 정수 객체를 생성하는 함수를 사용합니다. 이 접근 방식을 사용하면 변환 코드를 다시 작성하지 않고 쉽게 확장할 수 있습니다.
그러나 동일한 상수가 동일한 개체를 사용하도록 보장하는 최종 최적화는 AST 변환 중이 아니라 바이트코드 컴파일 중에 발생합니다. 특히,compile_add_o 함수는 사전 객체에 상수를 저장하는 역할을 하며, 결과적으로 동일한 상수가 동일한 슬롯에 들어가고 최종 바이트코드에서 단일 상수로 표시됩니다.
위 내용은 Python이 일부 정수를 캐시하고 다른 정수는 캐시하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!