Advertisement
Advertisement

More Related Content

Slideshows for you(19)

Similar to Writing Fast Code (KR)(20)

Advertisement
Advertisement

Writing Fast Code (KR)

  1. PureEducation : https://youtu.be/_IVqMXPFYwI
  2. WRITING FAST CODE 파이콘 한국 2015 김영근 (@scari_net)
  3. 발표자 소개
  4. • 김영근 a.k.a. scari • http://younggun.kim • Badass Alien @ D9, 스마트스터디 • PyCon KR Organizer • PyCon US 2015 Session Staff
  5. 내가 생각하는 내 코드의 실행 속도
  6. 영화 놈놈놈
  7. 실제 실행 속도
  8. The Killers : All These Things That I’ve Done M/V
 https://youtu.be/sZTpLvsYYHw
  9. 목표
  10. • 컴퓨터와 파이썬의 내부 이해하기 • 프로파일링으로 핫스팟 찾기 • 개선 -> 빠른 코드!
  11. 진짜 목표
  12. • 빠르면서도 느린 컴퓨터 • 잘 모르겠지만 프로파일링은 좋은 녀석 • 나도 빠른 코드 짜고 싶다.
  13. 근데 왜? Why?
  14. 10만명이 사용하는 코드의 성능을 1초만 개선하면 10만초 -> 하루하고도 3시간 46분 40초 절약 인류가 낭비하는 시간 절약!
  15. 발표 순서 TOC
  16. 컴퓨터의 동작 원리부터
  17. 파이썬 코드가 어떻게 굴러가는지 확인
  18. 프로파일러 한 숟가락 넣고
  19. 간단한 개선 작업 후 성능 확인
  20. WARNING Don’t worry. I know this is PyCon.
  21. 컴퓨터의 동작 원리부터
  22. 입출력 장치 <<<넘사벽<<< 메모리
  23. 모스(Morse) 부호 Modem (2400) CDMA(2G) HSPA(3G, DL) LTE* USB 2.0 802.11n USB 3.0 SATA 3.0 Thunderbolt 2 DDR2 1066Mhz DDR3 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
  24. 우왕 역시 메모리 짱 빠룸! (과연...)
  25. DDR3 1600Mhz FSB 400 (old Xeon) PCI Express 3.0 (x16) QuickPath Interconnect HyperTransport 3.1 L3 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
  26. 오케이...
  27. 컴퓨터의 계산 방식
  28. 0 or 1
  29. 00100000001000100000000101011110
  30. 00100000001000100000000101011110 opcode addr 1 addr 2 value MIPS32 Add Immediate instruction (ADDI) addi $r1, $r2, 350
  31. Clock Hz (Hertz)
  32. 인스트럭션 당 하나 이상의 클럭 여러 클럭이 필요할 수도 있음
  33. 엄마가! 밥 먹으면서! 스마트폰! 어! 보지 말라고! 몇 번을! 말해! 으휴~~~ (찰싹!) (찰싹!) (찰싹!) (찰싹!) (찰싹!) (찰싹!) (찰싹!) (찰싹!)(찰싹!)(찰싹!)(찰싹!)
  34. 좀 더 알아보기 쉽게
  35. 1초에 찰싹 한번 = 1Hz
  36. 1초에 찰싹 한번 L1 Cache Acces L2 Cache Access L3 Cache Access RAM Access SSD I/O HDD I/O Internet: Seoul to SF IPython 실행 (0.6초) Reboot (5m) = 1Hz 3초 9초 43초 6분 2-6일 1-12달 12년 63년 32,000년!!
  37. 거리로 환산
  38. L1 Cache Acces L2 Cache Access L3 Cache Access RAM Access SSD I/O HDD I/O Internet: SF to Seoul IPython 실행 (0.6초) Reboot (5m) 32,000년!! 내 책상 방 창문 집 밖 지하철 역 걸어서 부산까지 걸어서 인천-런던 왕복 명왕성 벗어남... 처녀자리 70 b 안드로메다?
  39. 결국 컴퓨터가 하는
  40. 찰싹 찰싹 맞으며 때로는 먼 우주로부터 데이터를 가져와서 처리하는 것.
  41. 1초에 찰싹 한번 = 1Hz
  42. 그러니까 일을 덜 하면 덜 아프다.. 가 아니고 빠르다.
  43. 이제 파이썬
  44. dis
  45. dis
  46. 아니고. pip install dis
  47. 소스 줄 번호 주소 / 명령 파이썬 코드 인자
  48. 간단한 list dis질
  49. 빈 리스트 생성 [] vs list()
  50. 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)
  51. 아이템 찾기
  52. import dis def 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)
  53. 어떻게 동작하는지는 오케이. 그럼 얼마나 걸리는지는? 각종 프로파일러
  54. • timeit • cProfile • line_profiler • profiling
  55. timeit 간단. ipython 에서는 %timeit shell에서는 python -m timeit -c “” GC를 비활성 하므로 일반적인 상황과는 다름.
  56. • cProfile • 오버헤드 좀 있음. • 대신 정보량도 많음. • python -m cProfile code.py
  57. • profiling • 실시간 • 이흥섭님의 세션을 참고
  58. 간단한거 피보나치킨 http://fibonachicken.herokuapp.com
  59. 그냥 피보나치 수열 계산
  60. 문제 1. 피보나치킨은 nth 피보나치 숫자가 아니라 n-1번째 피보나치를 찾아야 함. 즉, 입력이 nth 피보나치일때 n-1번째 피보나치를 반환하면 됨.
  61. 문제 2. 근데 입력이 피보나치 수가 아니면? 배운자의 정리에 의하면 치킨도르.. 아니 제켄도르프 정리를 적용.
  62. 필요한 함수 • 일단 피보나치 구현 fib • 피보나치 수가 아닌지도 알아야 하니까 is_fibonacci • 이전 피보나치 수를 알아야 하니까 prev_fibonacci
  63. def fib(n): if n < 2: return n return fib(n-2) + fib(n-1)
  64. 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
  65. def prev_fibonacci(n): for i in range(n-1, 0, -1): if is_fibonacci(i): return i return 0
  66. 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
  67. (당연하지만) 왜 느릴까?
  68. 하는 일을 줄여야 한다.
  69. 이것 저것 고치고 다시
  70. 올ㅋ
  71. 아리송한 분은 Office Hour로!
  72. 근데 사실 잘 만들어 놓은 거 쓰는게 짱.
  73. pandas에서 거저 먹은 성능 개선
  74. 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')
  75. 850 배
  76. 코드는?
  77. 실제 코드는 한
  78. 정리
  79. 찰싹~
  80. 감사합니다
Advertisement