res라는 변수(데이터)는 리스트의 모든 요소를 가져와 더할 때마다 데이터에 접근합니다(#1). 시간적 지역성입니다. for 문의 e는 리스트를 순회하면서 매번 바로 옆의 데이터를 가져옵니다. 공간적 지역성이지요.
TIP 예제의 리스트 li는 요소로 1 ~ 5의 상수 객체를 갖기 때문에 공간적 지역성이 적용되었지만, 사실 파이썬의 리스트는 C 언어의 배열처럼 요소가 메모리 공간에서 연속적으로 있지 않으므로 공간적 지역성이 적용되지 않습니다. 이는 파이썬 인터널에 대한 내용으로 이 책에서 다루지 않습니다. 따라서 이 예제는 공간적 지역성을 이해하기 위한 목적으로 이해하면 됩니다.
캐시 히트가 잘 일어나도록 지역성을 고려해 작성한 코드를 캐시 프렌들리 코드(cache friendly code)라고 합니다. 하지만 지역성까지 고려해 코드를 작성하는 프로그래머는 많지 않습니다. 프로그래밍을 할 때 의식적으로 고려하지 않아도 코드의 많은 부분에 지역성이 적용되기 때문입니다. 지역성의 예로 든 코드만 봐도 지역성을 신경 써서 특별하게 작성된 코드가 아니라 그저 지금까지 우리가 만들어 온 코드 중 하나일 뿐입니다.
다시, 앞에서 한 질문을 던지겠습니다. 프로그램이 실행되면서 필요한 데이터가 모여 있을 확률이 얼마나 될까요?
매우 높습니다. 실제로 캐시에 필요한 데이터가 존재할 확률이 90% 이상이라고 합니다. 이 정도 확률이면 캐시를 사용하는 이유가 충분합니다.