Writing Fast Code (KR)
-
Upload
younggun-kim -
Category
Entertainment & Humor
-
view
1.451 -
download
13
Transcript of Writing Fast Code (KR)
![Page 2: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/2.jpg)
WRITING FAST CODE파이콘 한국 2015 김영근 (@scari_net)
![Page 3: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/3.jpg)
발표자 소개
![Page 4: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/4.jpg)
• 김영근 a.k.a. scari • http://younggun.kim • Badass Alien @ D9, 스마트스터디 • PyCon KR Organizer • PyCon US 2015 Session Staff
![Page 5: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/5.jpg)
내가 생각하는 내 코드의 실행 속도
![Page 6: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/6.jpg)
영화 놈놈놈
![Page 7: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/7.jpg)
실제 실행 속도
![Page 8: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/8.jpg)
The Killers : All These Things That I’ve Done M/V https://youtu.be/sZTpLvsYYHw
![Page 9: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/9.jpg)
목표
![Page 10: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/10.jpg)
• 컴퓨터와 파이썬의 내부 이해하기
• 프로파일링으로 핫스팟 찾기
• 개선 -> 빠른 코드!
![Page 11: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/11.jpg)
진짜 목표
![Page 12: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/12.jpg)
• 빠르면서도 느린 컴퓨터
• 잘 모르겠지만 프로파일링은 좋은 녀석
• 나도 빠른 코드 짜고 싶다.
![Page 13: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/13.jpg)
근데 왜? Why?
![Page 14: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/14.jpg)
10만명이 사용하는 코드의 성능을 1초만 개선하면
10만초 -> 하루하고도 3시간 46분 40초 절약
인류가 낭비하는 시간 절약!
![Page 15: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/15.jpg)
발표 순서 TOC
![Page 16: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/16.jpg)
컴퓨터의 동작 원리부터
![Page 17: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/17.jpg)
파이썬 코드가
어떻게 굴러가는지 확인
![Page 18: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/18.jpg)
프로파일러 한 숟가락 넣고
![Page 19: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/19.jpg)
간단한 개선 작업 후 성능 확인
![Page 20: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/20.jpg)
WARNING
Don’t worry. I know this is PyCon.
![Page 21: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/21.jpg)
컴퓨터의 동작 원리부터
![Page 22: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/22.jpg)
입출력 장치 <<<넘사벽<<< 메모리
![Page 23: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/23.jpg)
모스(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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/24.jpg)
우왕 역시 메모리 짱 빠룸!(과연...)
![Page 25: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/25.jpg)
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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/26.jpg)
오케이...
![Page 27: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/27.jpg)
컴퓨터의 계산 방식
![Page 28: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/28.jpg)
0 or 1
![Page 29: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/29.jpg)
00100000001000100000000101011110
![Page 30: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/30.jpg)
00100000001000100000000101011110opcode
addr 1
addr 2
value
MIPS32 Add Immediate instruction (ADDI)
addi $r1, $r2, 350
![Page 31: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/31.jpg)
ClockHz (Hertz)
![Page 32: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/32.jpg)
![Page 33: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/33.jpg)
인스트럭션 당 하나 이상의 클럭
여러 클럭이 필요할 수도 있음
![Page 34: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/34.jpg)
엄마가!밥 먹으면서!스마트폰!어!보지 말라고!몇 번을!말해!으휴~~~
(찰싹!)(찰싹!)(찰싹!)(찰싹!)(찰싹!)(찰싹!)(찰싹!)
(찰싹!)(찰싹!)(찰싹!)(찰싹!)
![Page 35: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/35.jpg)
![Page 36: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/36.jpg)
좀 더 알아보기 쉽게
![Page 37: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/37.jpg)
1초에 찰싹 한번 = 1Hz
![Page 38: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/38.jpg)
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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/39.jpg)
거리로 환산
![Page 40: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/40.jpg)
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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/41.jpg)
결국 컴퓨터가 하는 일
![Page 42: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/42.jpg)
찰싹 찰싹 맞으며
때로는 먼 우주로부터 데이터를 가져와서
처리하는 것.
![Page 43: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/43.jpg)
1초에 찰싹 한번 = 1Hz
![Page 44: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/44.jpg)
그러니까 일을 덜 하면 덜 아프다..
가 아니고 빠르다.
![Page 45: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/45.jpg)
이제 파이썬
![Page 46: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/46.jpg)
dis
![Page 47: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/47.jpg)
dis
![Page 48: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/48.jpg)
아니고.
pip install dis
![Page 49: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/49.jpg)
![Page 50: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/50.jpg)
소스 줄 번호
주소 / 명령 파이썬 코드
인자
![Page 51: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/51.jpg)
간단한 list dis질
![Page 52: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/52.jpg)
빈 리스트 생성
[] vs list()
![Page 53: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/53.jpg)
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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/54.jpg)
![Page 55: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/55.jpg)
아이템 찾기
![Page 56: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/56.jpg)
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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/57.jpg)
![Page 58: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/58.jpg)
![Page 59: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/59.jpg)
어떻게 동작하는지는 오케이.그럼 얼마나 걸리는지는?각종 프로파일러
![Page 60: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/60.jpg)
• timeit• cProfile• line_profiler• profiling
![Page 61: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/61.jpg)
timeit
간단.
ipython 에서는 %timeit
shell에서는 python -m timeit -c “”
GC를 비활성 하므로 일반적인 상황과는 다름.
![Page 62: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/62.jpg)
![Page 63: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/63.jpg)
• cProfile• 오버헤드 좀 있음.
• 대신 정보량도 많음.
• python -m cProfile code.py
![Page 64: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/64.jpg)
• profiling
• 실시간• 이흥섭님의 세션을 참고
![Page 66: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/66.jpg)
그냥 피보나치 수열 계산
![Page 67: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/67.jpg)
문제 1.
피보나치킨은 nth 피보나치 숫자가 아니라 n-1번째 피보나치를 찾아야 함.
즉, 입력이 nth 피보나치일때 n-1번째 피보나치를 반환하면 됨.
![Page 68: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/68.jpg)
문제 2.
근데 입력이 피보나치 수가 아니면?
배운자의 정리에 의하면 치킨도르.. 아니 제켄도르프 정리를 적용.
![Page 69: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/69.jpg)
필요한 함수
• 일단 피보나치 구현 fib
• 피보나치 수가 아닌지도 알아야 하니까 is_fibonacci
• 이전 피보나치 수를 알아야 하니까 prev_fibonacci
![Page 70: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/70.jpg)
def fib(n): if n < 2: return n return fib(n-2) + fib(n-1)
![Page 71: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/71.jpg)
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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/72.jpg)
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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/73.jpg)
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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/74.jpg)
![Page 75: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/75.jpg)
(당연하지만) 왜 느릴까?
![Page 76: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/76.jpg)
하는 일을 줄여야 한다.
![Page 77: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/77.jpg)
이것 저것 고치고 다시
![Page 78: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/78.jpg)
![Page 79: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/79.jpg)
올ㅋ
![Page 80: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/80.jpg)
아리송한 분은 Office Hour로!
![Page 81: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/81.jpg)
근데 사실 잘 만들어 놓은 거 쓰는게 짱.
![Page 82: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/82.jpg)
pandas에서 거저 먹은 성능 개선
![Page 83: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/83.jpg)
![Page 84: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/84.jpg)
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)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/85.jpg)
![Page 86: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/86.jpg)
![Page 87: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/87.jpg)
850 배
![Page 88: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/88.jpg)
코드는?
![Page 89: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/89.jpg)
실제 코드는 한 줄
![Page 90: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/90.jpg)
정리
![Page 91: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/91.jpg)
찰싹~
![Page 92: Writing Fast Code (KR)](https://reader036.fdocuments.net/reader036/viewer/2022082217/5883fc811a28ab884b8b4f35/html5/thumbnails/92.jpg)
감사합니다