Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Writing Fast Code (KR)

1,788 views

Published on

PyCon KR 2015
Writing Fast Code

Published in: Entertainment & Humor
  • Be the first to comment

Writing Fast Code (KR)

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

×