[Python] %timeit & %lprun & %mprun

1 minute read


Writing Efficient Python Code

  • PART2
  • %timeit을 통해 runtime을 examine할 수 있음
    • -r2를 통해 전체 run 횟수를, -n을 통해 한 run에서 몇 회 반복할지 설정 가능
    • %%timeit을 통해 multiple-line code의 runtime을 examine할 수 있음
    • ns = nanosecond 10^-9
    • µs(us) = microsecond 10^-6
    • ms = millisecond 10^-3
    • s = second 10^0
    • ipython에서만 가능(Jupyter notebook에서도 가능), script에 쓰고 싶은 경우 tiemit modeul 사용
  • line profiler 라이브러리의 %lprun을 통해 line 별 runtime을 examine할 수 있음

  • memory profiler 라이브러리의 %mprun을 통해 lineq 별 memory를 examine할 수 있음
    • function examine 위해서는 다른 파일로부터 function을 import해야함

%timeit

%timeit [num for num in range(51)]
%timeit [*range(51)]
2.03 µs ± 90.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
594 ns ± 53.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit -r2 -n10 [*range(51)]
708 ns ± 65 ns per loop (mean ± std. dev. of 2 runs, 10 loops each)
%timeit list()
%timeit []
83.8 ns ± 8.9 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
28.4 ns ± 1.35 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%%timeit

%%timeit -r2 -n10
num_list = [1,2,3,4,5]
mul_num_list = []
[mul_num_list.append(num * 2) for num in num_list]
2.31 µs ± 781 ns per loop (mean ± std. dev. of 2 runs, 10 loops each)

%lprun

# Jupyter Notebook에서 패키지 설치
# import sys
# !{sys.executable} -m pip install line_profiler

import numpy as np
%load_ext line_profiler

heroes = ['Batman']
hts = np.array([188.0])
wts = np.array([95.0])

def convert_units_broadcast(heroes, heights, weights):

    # Array broadcasting instead of list comprehension
    new_hts = heights * 0.39370
    new_wts = weights * 2.20462

    hero_data = {}

    for i,hero in enumerate(heroes):
        hero_data[hero] = (new_hts[i], new_wts[i])

    return hero_data

%lprun -f convert_units_broadcast convert_units_broadcast(heroes, hts, wts)

# time이 적을수록 gut!

%mprun

# Jupyter Notebook에서 패키지 설치
# import sys
# !{sys.executable} -m pip install memory_profiler

from hero_funcs import convert_units

%load_ext memory_profiler
%mprun -f convert_units convert_units(heroes, hts, wts)

# Mem usage가 적을수록 gut!

Tags:

Categories:

Updated: