SlideShare a Scribd company logo
PythonIntermediateProgramming
임찬식(chanshik@gmail.com)
1
PythonIntermediateProgramming
타입과 객체
함수와함수형프로그래밍
클래스와객체지향프로그래밍
데이터구조
튜닝과 최적화
2
튜닝과 최적화
시간 측정
메모리측정
프로파일링
튜닝전략
3
시간 측정
time.clock()
현재CPU 경과 시간 값을얻어올때사용
time.time()
실제실행시간을얻어올때사용
timeit.timeit(code[, setup])
매우짧게 실행되는문장에대해서시간을측정할때사용
>>> from timeit import timeit
>>> timeit('math.sqrt(2.0)', 'import math')
0.11009419399488252
>>> timeit('sqrt(2.0)', 'from math import sqrt')
0.06311527400976047
4
시간 측정
timeit('math.sqrt(2.0)', 'import math')
첫번째인수는벤치마크하려는코드
두번째인수는실행환경을설정하기 위해한번만실행될문장
number=count 키워드인수를설정해반복할실행횟수지정
timeit() 함수는벤치마크코드를100만번실행하고 경과 시간 보고
timeit.repeat(code[, setup])
시간을세번측정하고 결과를리스트로반환
>>> from timeit import repeat
>>> repeat('math.sqrt(2.0)', 'import math')
[0.09879132499918342, 0.09977803799847607, 0.09539347399550024
>>> repeat('sqrt(2.0)', 'from math import sqrt')
[0.0634966959914891, 0.060734901009709574, 0.05894679999619257
5
메모리측정
sys.getsizeof()
개별파이썬객체메모리사용량을바이트단위로반환
>>> import sys
>>> sys.getsizeof(10)
28
>>> sys.getsizeof("Hello, World!")
62
>>> sys.getsizeof([1, 2, 3, 4])
96
>>> sum(sys.getsizeof(x) for x in [1, 2, 3, 4])
112
리스트, 튜플, 사전같은컨테이너에대해서얻은크기는
컨테이너객체그 자체의크기만을의미
내부에있는모든객체크기를계산하려면sum() 을이용
6
프로그램프로파일링
profile, cProfile
프로파일정보를수집하는데사용되는모듈
도달범위(coverage) 분석
성능통계 정보수집
명령줄에서cProfile실행
% python -m cProfile program.py
7
프로그램프로파일링
보고서항목별의미
항목 설명
primitivecalls 비재귀 함수호출횟수
ncalls 총호출횟수(자신에대한호출도포함)
tottime 이함수에서머무른시간
percall tottime/ncalls
cumtime 이함수에서머무른총시간
percall cumtime/(primitivecalls)
filename:lineno(function) 각함수의위치와이름
8
튜닝전략: 프로그램이해
최적화하려는코드를먼저프로파일링후에가장시간을많이
사용하는함수나메서드에초점을맞추어최적화진행
드물게 호출되는확실하지않은연산을최적화하는것은
전체적인속도향상에도움이되지않음
9
튜닝전략: 알고리즘이해
비효율적인알고리즘을최적화하기 보다는더나은알고리즘고민을먼저
형편없이구현된O(nlogn) 알고리즘이잘구현된O (n^3) 보다는
월등히빠른성능을내는게 일반적
10
튜닝전략: 내장타입사용
파이썬내장타입(튜플, 리스트, 집합, 사전)은모두C 로구현되어
빠른성능을보이므로내장타입을활발하게 사용하고 데이터구조를
만들어내장데이터타입을흉내내는것은비효율적
표준라이브러리에있는타입도필요한상황에맞게 사용
리스트앞에데이터를추가하는작업에는collection.deque사용고려
리스트가장앞에항목을추가하면모든데이터를옆으로옮기는비효율적인
작업을수행해야하는데, 이경우에는deque가 적절한데이터구조
>>> timeit('s.insert(0, 42)', 's=[]', number=100000)
3.213872305001132
>>> timeit('s.appendleft(42)',
>>> 'import collections; s = collections.deque()',
>>> number=100000)
0.010021128007792868
11
튜닝전략: 계층을추가하지않는것
객체나함수에대해서계층을추가하는것은성능에영향을주기 때문에
계층을추가하는것에대해고민하는것이필요
dict() 함수를사용해서문자열키를갖는사전을생성하는것은
따옴표를제거하는효과가 있지만, 성능에영향을줌
s = dict(name='GOOG',shares=100,price=450.10)
# s = {'name':'GOOG','shares':100,'price':450.10} 와 동일
>>> timeit(
... "s = {'name':'GOOG','shares':100,'price':450.10}")
0.1306551239977125
>>> timeit(
... "s = dict(name='GOOG',shares=100,price=450.10)")
0.3718919529928826
12
튜닝전략: 사용자정의클래스와인스턴스의기반은사전
인스턴스데이터를검색하고 설정하는작업은사전을
직접이용하는것보다대부분느림
데이터를저장하기 위한간단한자료구조를원한다면
클래스정의보다는사전을사용하는것이더효율적
stock.py
class Stock(object):
def __init__(self, name, shares, price):
self.name = name
self.shares = shares
self.price = price
>>> timeit("s=Stock('GOOG',100,450.0)",
>>> "from stock import Stock")
0.5741711250011576
>>> timeit("s={'name':'GOOG','shares':100,'price':450.0}")
0.13291993999155238
13
튜닝전략: __slots__ 사용
프로그램에서사용자정의클래스인스턴스를다수생성할경우에는
__slots__ 속성을이용해사전을사용하지않는것 고려
stock.py
class StockSlots(object):
__slots__ = ['name', 'shares', 'price']
def __init__(self, name, shares, price):
self.name = name
self.shares = shares
self.price = price
__slots__ 을사용하면인스턴스데이터를사전이아닌자료구조에저장
>>> timeit("s=Stock('GOOG',100,450.0)", "from stock import Stoc
0.5932310930074891
>>> timeit("s=StockSlots('GOOG',100,450.0)", "from stock import
0.4837448360049166
14
튜닝전략: 점(.) 연산자사용자제
객체속성을찾을때점(.) 연산자를사용하면항상이름검색이수행
메서드검색이나모듈검색이잦은경우에는지역변수를사용해
속성검색연산을제거하는것이효율적
>>> timeit("math.sqrt(5.0)", "import math")
0.0976861710078083
>>> timeit("sqrt(5.0)", "from math import sqrt")
0.06044331699376926
속성검색을제거하는것이가독성에영향을줄수있으므로
성능이중요한곳에서사용하는것이좋음
15
튜닝전략: 예외처리
흔하게 발생하지않는경우를처리하기 위해서예외를사용
예외를잘발생시키지않는코드를try 블록으로처리
if문을이용해잘발생하지않는조건을검색하는것은
비효율적
흔한경우에대한예외처리는피하는형태로구현
흔하게 발생하는예외는조건을직접검사하는방식이효율적
16
튜닝전략: 예외처리
get_item.py
def get_item_try(items, key):
try:
value = items[key]
except KeyError:
value = None
return value
def get_item_in(items, key):
if key in items:
value = items[key]
else:
value = None
return value
17
튜닝전략: 예외처리
>>> timeit("get_item_try({'a': 10, 'b': 20}, 'c')",
>>> "from get_item import get_item_try")
0.6027262949937722
>>> timeit("get_item_in({'a': 10, 'b': 20}, 'c')",
>>> "from get_item import get_item_in")
0.26192101500055287
18
튜닝전략: 함수형프로그래밍
데이터처리를수행할때리스트내포와생성기 표현식은직접데이터에대해
반복을수행하는연산에비해효율적
생성기를사용해더빠르면서메모리를효율적으로사용하는코드작성가능
19

More Related Content

Viewers also liked (19)

PPTX
Analisis de pest
Luis León Garcia
 
PDF
CDNによるInternet支配の現状とICNの可能性
J-Stream Inc.
 
PPTX
Deep phenotyping to aid identification of coding & non-coding rare disease v...
mhaendel
 
PDF
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
 
PDF
Deep learning を用いた画像から説明文の自動生成に関する研究の紹介
株式会社メタップスホールディングス
 
PPSX
RETHINKING GLOBAL POVERTY (Part Two)
Efiong Etuk
 
PPTX
制作会社の視点で見る デザイナーのキャリアパスとスキル
Tomoyuki Arasuna
 
PDF
10 more lessons learned from building Machine Learning systems
Xavier Amatriain
 
PPTX
Why Sales and Content Are Important Skills For Students To Learn
Ali Hanif
 
PPTX
A New Loading Dock Design
Dale Hudson
 
PPTX
Python programming for Bioinformatics
Hyungyong Kim
 
PDF
React js 1
JaeKwang Jung
 
PDF
발표자료 1인qa로살아남는6가지방법
SangIn Choung
 
PDF
H3 2011 모바일에서의 Location API 완전정복
KTH
 
PDF
Cybercrime in Russia: Trends and Issues
Alex Matrosov
 
PDF
『고성능 파이썬』 - 맛보기
복연 이
 
PDF
Understanding the black hat hacker eco system
David Sweigert
 
PPTX
Logcat과 함께 하는 모바일 웹 디버깅
JinKwon Lee
 
PPTX
아카마이 CDN 과 함께, 마음이 편해지는 인프라 설계
Seung Heun Noh
 
Analisis de pest
Luis León Garcia
 
CDNによるInternet支配の現状とICNの可能性
J-Stream Inc.
 
Deep phenotyping to aid identification of coding & non-coding rare disease v...
mhaendel
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
 
Deep learning を用いた画像から説明文の自動生成に関する研究の紹介
株式会社メタップスホールディングス
 
RETHINKING GLOBAL POVERTY (Part Two)
Efiong Etuk
 
制作会社の視点で見る デザイナーのキャリアパスとスキル
Tomoyuki Arasuna
 
10 more lessons learned from building Machine Learning systems
Xavier Amatriain
 
Why Sales and Content Are Important Skills For Students To Learn
Ali Hanif
 
A New Loading Dock Design
Dale Hudson
 
Python programming for Bioinformatics
Hyungyong Kim
 
React js 1
JaeKwang Jung
 
발표자료 1인qa로살아남는6가지방법
SangIn Choung
 
H3 2011 모바일에서의 Location API 완전정복
KTH
 
Cybercrime in Russia: Trends and Issues
Alex Matrosov
 
『고성능 파이썬』 - 맛보기
복연 이
 
Understanding the black hat hacker eco system
David Sweigert
 
Logcat과 함께 하는 모바일 웹 디버깅
JinKwon Lee
 
아카마이 CDN 과 함께, 마음이 편해지는 인프라 설계
Seung Heun Noh
 

Similar to Python Programming: Tuning and Optimization (20)

PDF
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
Tae Young Lee
 
PDF
알고리즘 시각화 라이브러리 ipytracer 개발기
Han Lee
 
PDF
Light Tutorial Python
Kwangyoun Jung
 
PDF
파이썬 데이터 분석 (18년)
SK(주) C&C - 강병호
 
PDF
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
Tae Young Lee
 
PDF
파이썬으로 익히는 딥러닝
SK(주) C&C - 강병호
 
PPTX
파이썬+주요+용어+정리 20160304
Yong Joon Moon
 
PPTX
Hello python 오리엔테이션(파이썬 스터디, 발표자료)
Cherucy
 
PDF
01 built in-data_type
Ju-Hyung Lee
 
PDF
파이썬 제대로 활용하기
Hansol Kang
 
PDF
Writing Fast Code (KR)
Younggun Kim
 
PDF
Python Programming: Type and Object
Chan Shik Lim
 
PDF
Profiling - 실시간 대화식 프로파일러
Heungsub Lee
 
PPTX
문과생 대상 파이썬을 활용한 데이터 분석 강의
Kwangyoun Jung
 
PPTX
파이썬 함수 이해하기
Yong Joon Moon
 
PDF
[NDC08] 최적화와 프로파일링 - 송창규
ChangKyu Song
 
PPTX
파이썬 쪼렙 탈출 1주차
건환 손
 
PPTX
파이썬+함수이해하기 20160229
Yong Joon Moon
 
PPTX
1.introduction(epoch#2)
Haesun Park
 
PDF
1 Python기초 오리엔테이션
cpt mobilex
 
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
Tae Young Lee
 
알고리즘 시각화 라이브러리 ipytracer 개발기
Han Lee
 
Light Tutorial Python
Kwangyoun Jung
 
파이썬 데이터 분석 (18년)
SK(주) C&C - 강병호
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
Tae Young Lee
 
파이썬으로 익히는 딥러닝
SK(주) C&C - 강병호
 
파이썬+주요+용어+정리 20160304
Yong Joon Moon
 
Hello python 오리엔테이션(파이썬 스터디, 발표자료)
Cherucy
 
01 built in-data_type
Ju-Hyung Lee
 
파이썬 제대로 활용하기
Hansol Kang
 
Writing Fast Code (KR)
Younggun Kim
 
Python Programming: Type and Object
Chan Shik Lim
 
Profiling - 실시간 대화식 프로파일러
Heungsub Lee
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
Kwangyoun Jung
 
파이썬 함수 이해하기
Yong Joon Moon
 
[NDC08] 최적화와 프로파일링 - 송창규
ChangKyu Song
 
파이썬 쪼렙 탈출 1주차
건환 손
 
파이썬+함수이해하기 20160229
Yong Joon Moon
 
1.introduction(epoch#2)
Haesun Park
 
1 Python기초 오리엔테이션
cpt mobilex
 
Ad

More from Chan Shik Lim (6)

PPTX
FPV Streaming Server with ffmpeg
Chan Shik Lim
 
PDF
Improving monitoring systems Interoperability with OpenMetrics
Chan Shik Lim
 
PPTX
pgday.seoul 2019: TimescaleDB
Chan Shik Lim
 
PDF
Kubernetes on Premise Practical Guide
Chan Shik Lim
 
PDF
Kubernetes on Premise
Chan Shik Lim
 
PPTX
Hadoop High Availability Summary
Chan Shik Lim
 
FPV Streaming Server with ffmpeg
Chan Shik Lim
 
Improving monitoring systems Interoperability with OpenMetrics
Chan Shik Lim
 
pgday.seoul 2019: TimescaleDB
Chan Shik Lim
 
Kubernetes on Premise Practical Guide
Chan Shik Lim
 
Kubernetes on Premise
Chan Shik Lim
 
Hadoop High Availability Summary
Chan Shik Lim
 
Ad

Python Programming: Tuning and Optimization