Top Banner
PureEducation : https://youtu.be/_IVqMXPFYwI
92

Writing Fast Code (KR)

Jan 22, 2017

Download

Younggun Kim
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Writing Fast Code (KR)

PureEducation : https://youtu.be/_IVqMXPFYwI

Page 2: Writing Fast Code (KR)

WRITING FAST CODE파이콘 한국 2015 김영근 (@scari_net)

Page 3: Writing Fast Code (KR)

발표자 소개

Page 4: Writing Fast Code (KR)

• 김영근 a.k.a. scari • http://younggun.kim • Badass Alien @ D9, 스마트스터디 • PyCon KR Organizer • PyCon US 2015 Session Staff

Page 5: Writing Fast Code (KR)

내가 생각하는 내 코드의 실행 속도

Page 6: Writing Fast Code (KR)

영화 놈놈놈

Page 7: Writing Fast Code (KR)

실제 실행 속도

Page 8: Writing Fast Code (KR)

The Killers : All These Things That I’ve Done M/V https://youtu.be/sZTpLvsYYHw

Page 9: Writing Fast Code (KR)

목표

Page 10: Writing Fast Code (KR)

• 컴퓨터와 파이썬의 내부 이해하기

• 프로파일링으로 핫스팟 찾기

• 개선 -> 빠른 코드!

Page 11: Writing Fast Code (KR)

진짜 목표

Page 12: Writing Fast Code (KR)

• 빠르면서도 느린 컴퓨터

• 잘 모르겠지만 프로파일링은 좋은 녀석

• 나도 빠른 코드 짜고 싶다.

Page 13: Writing Fast Code (KR)

근데 왜? Why?

Page 14: Writing Fast Code (KR)

10만명이 사용하는 코드의 성능을 1초만 개선하면

10만초 -> 하루하고도 3시간 46분 40초 절약

인류가 낭비하는 시간 절약!

Page 15: Writing Fast Code (KR)

발표 순서 TOC

Page 16: Writing Fast Code (KR)

컴퓨터의 동작 원리부터

Page 17: Writing Fast Code (KR)

파이썬 코드가

어떻게 굴러가는지 확인

Page 18: Writing Fast Code (KR)

프로파일러 한 숟가락 넣고

Page 19: Writing Fast Code (KR)

간단한 개선 작업 후 성능 확인

Page 20: Writing Fast Code (KR)

WARNING

Don’t worry. I know this is PyCon.

Page 21: Writing Fast Code (KR)

컴퓨터의 동작 원리부터

Page 22: Writing Fast Code (KR)

입출력 장치 <<<넘사벽<<< 메모리

Page 23: Writing Fast Code (KR)

모스(Morse) 부호 Modem (2400) CDMA(2G) HSPA(3G, DL)LTE*USB 2.0802.11nUSB 3.0SATA 3.0Thunderbolt 2DDR2 1066MhzDDR3 1600Mhz

https://en.wikipedia.org/wiki/List_of_device_bit_rates

≈ 21 bps≈ 2400 bps≈ 153 kbit/s≈ 13.98 Mbit/s≈ 100 Mbit/s≈ 480 Mbit/s≈ 600 Mbit/s≈ 3 Gbit/s≈ 6 Gbit/s≈ 20 Gbit/s≈ 64 Gbit/s≈ 102.4 Gbit/s

Page 24: Writing Fast Code (KR)

우왕 역시 메모리 짱 빠룸!(과연...)

Page 25: Writing Fast Code (KR)

DDR3 1600MhzFSB 400 (old Xeon)PCI Express 3.0 (x16)QuickPath InterconnectHyperTransport 3.1L3 Cache(i7-4790X)L2 Cache(i7-4790X)

≈ 12.8 GB/s≈ 12.8 GB/s≈ 16 GB/s≈ 38.4 GB/s≈ 51.2 GB/s≈ 170 GB/s≈ 308 GB/s

Page 26: Writing Fast Code (KR)

오케이...

Page 27: Writing Fast Code (KR)

컴퓨터의 계산 방식

Page 28: Writing Fast Code (KR)

0 or 1

Page 29: Writing Fast Code (KR)

00100000001000100000000101011110

Page 30: Writing Fast Code (KR)

00100000001000100000000101011110opcode

addr 1

addr 2

value

MIPS32 Add Immediate instruction (ADDI)

addi $r1, $r2, 350

Page 31: Writing Fast Code (KR)

ClockHz (Hertz)

Page 32: Writing Fast Code (KR)
Page 33: Writing Fast Code (KR)

인스트럭션 당 하나 이상의 클럭

여러 클럭이 필요할 수도 있음

Page 34: Writing Fast Code (KR)

엄마가!밥 먹으면서!스마트폰!어!보지 말라고!몇 번을!말해!으휴~~~

(찰싹!)(찰싹!)(찰싹!)(찰싹!)(찰싹!)(찰싹!)(찰싹!)

(찰싹!)(찰싹!)(찰싹!)(찰싹!)

Page 35: Writing Fast Code (KR)
Page 36: Writing Fast Code (KR)

좀 더 알아보기 쉽게

Page 37: Writing Fast Code (KR)

1초에 찰싹 한번 = 1Hz

Page 38: Writing Fast Code (KR)

1초에 찰싹 한번

L1 Cache AccesL2 Cache AccessL3 Cache AccessRAM AccessSSD I/OHDD I/OInternet: Seoul to SFIPython 실행 (0.6초)Reboot (5m)

= 1Hz

3초 9초

43초6분

2-6일1-12달

12년63년

32,000년!!

Page 39: Writing Fast Code (KR)

거리로 환산

Page 40: Writing Fast Code (KR)

L1 Cache AccesL2 Cache AccessL3 Cache AccessRAM AccessSSD I/OHDD I/OInternet: SF to SeoulIPython 실행 (0.6초)Reboot (5m) 32,000년!!

내 책상방 창문집 밖

지하철 역걸어서 부산까지

걸어서 인천-런던 왕복명왕성 벗어남...처녀자리 70 b안드로메다?

Page 41: Writing Fast Code (KR)

결국 컴퓨터가 하는 일

Page 42: Writing Fast Code (KR)

찰싹 찰싹 맞으며

때로는 먼 우주로부터 데이터를 가져와서

처리하는 것.

Page 43: Writing Fast Code (KR)

1초에 찰싹 한번 = 1Hz

Page 44: Writing Fast Code (KR)

그러니까 일을 덜 하면 덜 아프다..

가 아니고 빠르다.

Page 45: Writing Fast Code (KR)

이제 파이썬

Page 46: Writing Fast Code (KR)

dis

Page 47: Writing Fast Code (KR)

dis

Page 48: Writing Fast Code (KR)

아니고.

pip install dis

Page 49: Writing Fast Code (KR)
Page 50: Writing Fast Code (KR)

소스 줄 번호

주소 / 명령 파이썬 코드

인자

Page 51: Writing Fast Code (KR)

간단한 list dis질

Page 52: Writing Fast Code (KR)

빈 리스트 생성

[] vs list()

Page 53: Writing Fast Code (KR)

import dis

def create_empty_list(): return list()

def create_empty_list2(): return []

print('list()')dis.dis(create_empty_list)print('[]')dis.dis(create_empty_list2)

Page 54: Writing Fast Code (KR)
Page 55: Writing Fast Code (KR)

아이템 찾기

Page 56: Writing Fast Code (KR)

import disdef find_x(x, my_list): for elem in my_list: if x == elem: return True

def find_x2(x, my_list): if x in my_list: return True

print('find_x()')dis.dis(find_x)print('find_x2()')dis.dis(find_x2)

Page 57: Writing Fast Code (KR)
Page 58: Writing Fast Code (KR)
Page 59: Writing Fast Code (KR)

어떻게 동작하는지는 오케이.그럼 얼마나 걸리는지는?각종 프로파일러

Page 60: Writing Fast Code (KR)

• timeit• cProfile• line_profiler• profiling

Page 61: Writing Fast Code (KR)

timeit

간단.

ipython 에서는 %timeit

shell에서는 python -m timeit -c “”

GC를 비활성 하므로 일반적인 상황과는 다름.

Page 62: Writing Fast Code (KR)
Page 63: Writing Fast Code (KR)

• cProfile• 오버헤드 좀 있음.

• 대신 정보량도 많음.

• python -m cProfile code.py

Page 64: Writing Fast Code (KR)

• profiling

• 실시간• 이흥섭님의 세션을 참고

Page 65: Writing Fast Code (KR)

간단한거

피보나치킨http://fibonachicken.herokuapp.com

Page 66: Writing Fast Code (KR)

그냥 피보나치 수열 계산

Page 67: Writing Fast Code (KR)

문제 1.

피보나치킨은 nth 피보나치 숫자가 아니라 n-1번째 피보나치를 찾아야 함.

즉, 입력이 nth 피보나치일때 n-1번째 피보나치를 반환하면 됨.

Page 68: Writing Fast Code (KR)

문제 2.

근데 입력이 피보나치 수가 아니면?

배운자의 정리에 의하면 치킨도르.. 아니 제켄도르프 정리를 적용.

Page 69: Writing Fast Code (KR)

필요한 함수

• 일단 피보나치 구현 fib

• 피보나치 수가 아닌지도 알아야 하니까 is_fibonacci

• 이전 피보나치 수를 알아야 하니까 prev_fibonacci

Page 70: Writing Fast Code (KR)

def fib(n): if n < 2: return n return fib(n-2) + fib(n-1)

Page 71: Writing Fast Code (KR)

def is_fibonacci_awful(n): i = 0 while True: if fib(i) == n: return True elif fib(i) > n: return False else: i += 1 continue

is_fibonacci = is_fibonacci_awful

Page 72: Writing Fast Code (KR)

def prev_fibonacci(n): for i in range(n-1, 0, -1): if is_fibonacci(i): return i return 0

Page 73: Writing Fast Code (KR)

def fibonachicken(n): if is_fibonacci(n) and n > 1: #1인 1닭 return prev_fibonacci(n)

chickens = 0 while n > 1: cfib = prev_fibonacci(n) chickens += prev_fibonacci(cfib) n -= cfib return chickens + n

Page 74: Writing Fast Code (KR)
Page 75: Writing Fast Code (KR)

(당연하지만) 왜 느릴까?

Page 76: Writing Fast Code (KR)

하는 일을 줄여야 한다.

Page 77: Writing Fast Code (KR)

이것 저것 고치고 다시

Page 78: Writing Fast Code (KR)
Page 79: Writing Fast Code (KR)

올ㅋ

Page 80: Writing Fast Code (KR)

아리송한 분은 Office Hour로!

Page 81: Writing Fast Code (KR)

근데 사실 잘 만들어 놓은 거 쓰는게 짱.

Page 82: Writing Fast Code (KR)

pandas에서 거저 먹은 성능 개선

Page 83: Writing Fast Code (KR)
Page 84: Writing Fast Code (KR)

import pandas as pd

intSeries = pd.Series(5, pd.date_range(start='2000-01-01', end='2000-01-08', freq='555000U'), dtype=‘int64')

timeSeries = intSeries.astype('datetime64[ns]')

%timeit intSeries.resample('1S', how='last')%timeit timeSeries.resample('1S', how='last')%prun intSeries.resample('1S', how='last')%prun timeSeries.resample('1S', how='last')

Page 85: Writing Fast Code (KR)
Page 86: Writing Fast Code (KR)
Page 87: Writing Fast Code (KR)

850 배

Page 88: Writing Fast Code (KR)

코드는?

Page 89: Writing Fast Code (KR)

실제 코드는 한 줄

Page 90: Writing Fast Code (KR)

정리

Page 91: Writing Fast Code (KR)

찰싹~

Page 92: Writing Fast Code (KR)

감사합니다