writing fast code - pycon hk 2015
TRANSCRIPT
![Page 3: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/3.jpg)
Badass Alien @ District 9, SMARTSTUDY
http://pengpenghu.com
PyCon Korea Organizer http://pycon.kr @pyconkr PyCon APAC 2016 Host (2016/Aug/13-15)
![Page 4: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/4.jpg)
What I Think My Code Run
Movie - The Good The Bad The Weird, 2008
![Page 5: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/5.jpg)
How My Code Really Run
The Killers : All These Things That I’ve Done M/V https://youtu.be/sZTpLvsYYHw
![Page 6: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/6.jpg)
Objective
![Page 7: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/7.jpg)
1. Understanding How Computer Works
![Page 8: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/8.jpg)
2. How to use Profiler
![Page 9: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/9.jpg)
But why?
![Page 10: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/10.jpg)
Say, thousands of people using your code everyday and if you save 1 second to run it, this means you could save over 4 days of time human race wasted per a year.
![Page 11: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/11.jpg)
See How Computer Works and How Fast Computer
and it’s peripherals
![Page 12: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/12.jpg)
I/O >> 4D Wall >> Memory
![Page 13: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/13.jpg)
Morse Code Modem (2400) CDMA(2G) HSPA(3G, DL)LTE*USB 2.0802.11nUSB 3.0SATA 3.0Thunderbolt 2DDR2 1066MhzDDR3 1600Mhz
≈ 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
https://en.wikipedia.org/wiki/List_of_device_bit_rates
![Page 14: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/14.jpg)
Yes! Memory is blazing fast! (Really?)
![Page 15: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/15.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
Nope!
![Page 16: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/16.jpg)
Computer Knows Only 0 and 1
![Page 17: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/17.jpg)
00100000001000100000000101011110
Like This
![Page 18: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/18.jpg)
00100000001000100000000101011110opcode
addr 1
addr 2
value
MIPS32 Add Immediate instruction (ADDI)
addi $r1, $r2, 350
$r1 = $r2 + 350
![Page 19: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/19.jpg)
Computer Execute These Instruction per clock basis
![Page 20: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/20.jpg)
Clock (Hz)
![Page 21: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/21.jpg)
![Page 22: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/22.jpg)
![Page 23: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/23.jpg)
![Page 24: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/24.jpg)
1Hz
![Page 25: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/25.jpg)
1Hz
L1 Cache AccesL2 Cache AccessL3 Cache AccessRAM AccessSSD I/OHDD I/OInternet: Tokyo to SFRun IPython (0.6s)Reboot (5m)
3s 9s
43s6m
2-6 days1-12 months
12 years63 years
32,000 years!!
![Page 26: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/26.jpg)
![Page 27: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/27.jpg)
Disassemble Python Code To CPython Bytecode To Support Analysis
dis module
https://docs.python.org/3/library/dis.html https://github.com/python/cpython/blob/master/Include/opcode.h
![Page 28: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/28.jpg)
![Page 29: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/29.jpg)
line # of source
op addr / instruction annotations
param
![Page 30: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/30.jpg)
An Empty List Creation
[] vs list()
![Page 31: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/31.jpg)
![Page 32: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/32.jpg)
![Page 33: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/33.jpg)
![Page 34: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/34.jpg)
Dictionary
{} vs dict()
![Page 35: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/35.jpg)
![Page 36: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/36.jpg)
![Page 37: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/37.jpg)
![Page 38: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/38.jpg)
Find an element in a list
using for-loop vs in
![Page 39: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/39.jpg)
![Page 40: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/40.jpg)
![Page 41: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/41.jpg)
![Page 42: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/42.jpg)
![Page 43: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/43.jpg)
A tool for dynamic program analysisthat measure the space or time
complexity of a program.
Profilers
![Page 44: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/44.jpg)
• cProfile (profile) • hotshot • line_profiler • memory_profiler • yappi • profiling • pyinstrument • plop • pprofile
![Page 45: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/45.jpg)
cProfile
• built-in profiling tool • hook into the VM in CPython • introduces overhead a bit
https://docs.python.org/3.5/library/profile.html
![Page 46: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/46.jpg)
cProfile
python -m cProfile python_code.py
![Page 47: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/47.jpg)
line_profiler
• can profile line-by-line basis • Uses a decorator to mark the
chosen function (@profile) • introduces greater overhead
https://github.com/rkern/line_profiler
![Page 48: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/48.jpg)
profiling• Interactive Python profiler which
inspired from Unity3D Profiler • Keep the call stack. • Live Profiling • Only Support Linux
https://github.com/what-studio/profiling
![Page 49: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/49.jpg)
https://github.com/sublee/pyconkr2015-profiling-resources/blob/master/continuous.gif
![Page 50: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/50.jpg)
fibona
Use profiler with real code
![Page 51: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/51.jpg)
fibonaKorean Fried Chicken Served as one chicken. (not pieces)
And it’s quite complex to determine how many chicken would enough for N people.
![Page 52: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/52.jpg)
fibonaThe problem can be solved easily using fibonacci number.
1 1 2 3 5 8 13 21 34 …
For Nth fibonacci number of people, N-1 th fibonacci number of chicken would be perfect.
![Page 53: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/53.jpg)
fibona
Awesome Idea! but how do you get enough chicken if number of the people is not an fibonacci number?
![Page 54: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/54.jpg)
fibonaApply Zeckendorf’s theorem, which is about the representation of integers as sum of Fibonacci number
![Page 55: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/55.jpg)
https://en.wikipedia.org/wiki/Zeckendorf's_theorem
![Page 56: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/56.jpg)
![Page 57: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/57.jpg)
![Page 58: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/58.jpg)
![Page 59: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/59.jpg)
![Page 60: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/60.jpg)
![Page 61: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/61.jpg)
KEEPCALMAND USE
THEPROFILER
![Page 62: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/62.jpg)
cProfile
python -m cProfile fibonachicken.py
![Page 63: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/63.jpg)
cProfile
![Page 64: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/64.jpg)
line_profiler
![Page 65: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/65.jpg)
line_profiler
kernprof -l -v fibonachicken.py
![Page 66: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/66.jpg)
line_profiler
![Page 67: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/67.jpg)
line_profiler
![Page 68: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/68.jpg)
line_profiler
![Page 69: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/69.jpg)
line_profiler
![Page 70: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/70.jpg)
Both fib() and is_fibonacci() is the bottleneck. Should replace these with better one
![Page 71: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/71.jpg)
Hypothesis #1
Improvement of fib() could result better performance
![Page 72: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/72.jpg)
Binet’s Formula
https://en.wikipedia.org/wiki/Jacques_Philippe_Marie_Binet
![Page 73: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/73.jpg)
cProfile
![Page 74: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/74.jpg)
Hypothesis #2
Can we improve is_fibonacci() not to use fib() at all?
![Page 75: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/75.jpg)
n is a Fibonacci number if and only if 5n*n+4 or 5n*n-4 is a square
Gessel’s Formula
http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html
![Page 76: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/76.jpg)
cProfile
![Page 77: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/77.jpg)
Summary
Consider efficiency of codes, along with peripherals, and circumstances around you
Form a hypothesis and confirm (using good profilers)
![Page 78: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/78.jpg)
QA
![Page 79: Writing Fast Code - PyCon HK 2015](https://reader030.vdocuments.site/reader030/viewer/2022020113/5883fcab1a28ab884b8b4f8d/html5/thumbnails/79.jpg)
Thanks!