IPython 매직 명령어

앞선 장에서는 IPython을 사용하여 파이썬을 효율적이고 대화형으로 활용하는 방법을 살펴보았습니다. 이번 섹션에서는 IPython이 일반 파이썬 구문에 추가한 유용한 기능들을 알아보겠습니다. 이 기능들은 IPython에서 매직 명령어(Magic Commands)라고 불리며, 앞에 % 문자가 붙는 것이 특징입니다. 매직 명령어는 데이터 분석 과정에서 흔히 발생하는 다양한 문제들을 간결하게 해결할 수 있도록 설계되었습니다. 매직 명령어는 크게 두 가지 형태가 있습니다. 한 줄 단위로 작동하는 라인 매직(Line Magics)은 접두사로 %를 하나 사용하고, 여러 줄에 걸쳐 작동하는 셀 매직(Cell Magics)은 접두사로 %%를 두 개 사용합니다. 먼저 몇 가지 간단한 예시를 살펴본 뒤, 나중에 유용한 매직 명령어들을 좀 더 자세히 다루겠습니다.

외부 코드 실행: %run

본격적으로 코드를 개발하다 보면, IPython에서 대화형으로 작업하는 동시에 텍스트 편집기에 코드를 저장해 재사용하는 방식을 쓰게 됩니다. 이때 코드를 별도의 창에서 실행하기보다 IPython 세션 내에서 바로 실행하면 무척 편리합니다. 이 작업은 %run 매직 명령어로 수행합니다.

예를 들어 다음과 같은 내용의 myscript.py 파일을 만들었다고 가정해 봅시다.

``python # 파일: myscript.py

def square(x): “““숫자의 제곱을 계산합니다”“” return x ** 2

for N in range(1, 4): print(f”{N}의 제곱은 {square(N)}입니다”)


IPython 세션에서 이 파일을 다음과 같이 실행합니다.

``ipython
In [6]: %run myscript.py
1의 제곱은 1입니다
2의 제곱은 4입니다
3의 제곱은 9입니다

스크립트를 실행한 후에는 그 안에 정의된 모든 함수를 IPython 세션에서 그대로 사용합니다.

``ipython In [7]: square(5) Out[7]: 25


코드 실행 방식을 세부적으로 조정하는 다양한 옵션이 있습니다. IPython 인터프리터에 **`%run?`**을 입력하면 관련 문서를 확인합니다.

## 코드 실행 시간 측정: %timeit
또 다른 유용한 매직 함수로 `%timeit`이 있습니다. 이 함수는 뒤따르는 파이썬 한 줄 명령어의 실행 시간을 자동으로 측정합니다.
예를 들어 리스트 컴프리헨션(List Comprehension)의 성능을 확인하고 싶을 때 유용합니다.

``ipython
In [8]: %timeit L = [n ** 2 for n in range(1000)]
430 µs ± 3.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit의 장점은 짧은 명령의 경우 더 정확한 결과를 얻기 위해 자동으로 여러 번 실행을 반복한다는 점입니다. 여러 줄로 된 명령문의 경우, % 기호를 두 개 붙여 셀 매직으로 사용하면 됩니다. 다음은 for 루프를 사용한 동일한 작업을 측정하는 예시입니다.

``ipython In [9]: %%timeit …: L = [] …: for n in range(1000): …: L.append(n ** 2) …: 484 µs ± 5.67 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


이 결과를 통해 리스트 컴프리헨션이 동일한 작업을 하는 `for` 루프보다 약 10% 정도 빠르다는 것을 바로 알 수 있습니다.
[코드 프로파일링 및 타이밍 측정](01.07-Timing-and-Profiling.ipynb) 섹션에서 `%timeit`을 비롯한 다양한 성능 측정 방식을 더 자세히 살펴보겠습니다.

## 매직 함수 도움말: ?, %magic, %lsmagic

일반 파이썬 함수와 마찬가지로 IPython 매직 함수에도 유용한 독스트링(docstring)이 포함되어 있습니다.
도움말은 표준적인 방식으로 확인합니다.
예를 들어 `%timeit` 매직 명령어의 문서를 읽으려면 다음과 같이 입력합니다.

``ipython
In [10]: %timeit?

다른 함수들도 같은 방식으로 도움말을 볼 수 있습니다. 사용 가능한 매직 명령어에 대한 전반적인 설명과 예시를 보려면 다음을 입력하세요.

``ipython In [11]: %magic


사용 가능한 모든 매직 명령어의 목록을 빠르게 확인하려면 다음을 입력합니다.

``ipython
In [12]: %lsmagic

마지막으로, 필요하다면 직접 매직 함수를 정의하는 것도 매우 간단합니다. 여기서는 다루지 않지만, 관심이 있다면 추가 IPython 리소스에 나열된 참고 자료를 확인해 보시기 바랍니다.