96페이지에 pip install numpy 명령이 적혀 있기는 합니다만,
pip에 대해 설명하지 않아서 그렇습니다.
Q&A 부분으로 혹시 행렬은 어떻게 계산하는지에 대한 질문과 답변이어서 이렇게 할 수 있다고 보여주는 부분이어서 그렇습니다.
Python을 실행 경로를 추가해서 설치했다면 명령 프롬프트에서 python을 실행했을 때 파이썬이 실행됩니다. exit()로 빠져나온 다음에
pip install numpy를 입력하면 numpy 모듈을 설치합니다. 이후에는 numpy 모듈을 사용할 수 있습니다.
C:\Users\gilbut>python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
C:\Users\gilbut>pip install numpy
Collecting numpy
Downloading https://files.pythonhosted.org/packages/07/46/656c25b39fc152ea525eef14b641993624a6325a8ae815b200de57cff0bc/numpy-1.16.4-cp37-cp37m-win32.whl (10.0MB)
100% |████████████████████████████████| 10.0MB 1.6MB/s
Installing collected packages: numpy
Successfully installed numpy-1.16.4
You are using pip version 18.1, however version 19.1.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
C:\Users\gilbut>
pip 사용법에 대해서는 UNIT 44.3(662페이지)에 설명되어 있습니다.
두 번째 refcount.py 예제는 IDLE에서 실행할 때와 파이썬 스크립트 모드로 실행할 때 결과가 다릅니다. 스크립트 모드로 실행해야 합니다. 코드 박스 위에 파일명이 있는 경우에는 스크립트 모드로 실행해주세요.
실행한 결과는 다음과 같습니다.
[Running] python -u "f:\works\python\refcount.py"
3
4
5
True
https://glot.io/snippets/fcnedsg5ar
y = 1000; print(sys.getrefcount(1000))
책에서는 sys.getrefcount(1000)을 처음 실행했을 때 2가 반환되었는데, 현재 파이썬에서는 3이 반환됩니다. 이는 내부 구현이 변경된 것으로 보입니다.
파이썬은 실행하면 바이트코드로 변환합니다. 작은 숫자나 문자열에 대해서는 최적화를 위해 사전에 할당된 메모리 공간에서 캐시를 합니다. 레퍼런스 카운트는 이 메모리 공간을 관리하기 위한 것입니다. 레퍼런스 카운트가 0이면 해당 객체를 파괴합니다.
이에 대해 자세히 알아보려면 초급 수준을 뛰어넘지만, 파이썬 바이트코드를 디스어셈블해서 볼 수 있습니다. 다음을 refcount2.py로 실행하면 됩니다.
import disimport sysprint(compile("sys.getrefcount(1000)", '', 'single').co_consts)print(dis.dis(compile("sys.getrefcount(1000)", '', 'single')))print(sys.getrefcount(1000))
glot.io에서 바로 확인할 수 있습니다.
https://glot.io/snippets/fcnenzdqxw
실행 결과는 다음과 같습니다.
(1000, None) 1 0 LOAD_NAME 0 (sys) 2 LOAD_ATTR 1 (getrefcount) 4 LOAD_CONST 0 (1000) 6 CALL_FUNCTION 1 8 PRINT_EXPR 10 LOAD_CONST 1 (None) 12 RETURN_VALUE None 3
LOAD_CONST (1000)에서 사용되지만, 내부에서 카운트 3을 반환하는 것을 알 수 있습니다.
레퍼런스 카운트가 동작하는지 알고 싶다면 refcount3.py로 다음과 같이 작성해보세요.
import sys
print(sys.getrefcount(1000))
x = 1000
print(sys.getrefcount(1000))
x = x + 1
print(sys.getrefcount(1000))
3 4 3