Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
High Performance FastAPI
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Ikuo Suyama
October 15, 2021
Programming
9.8k
17
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
High Performance FastAPI
PyCon JP 2021 発表資料です。
Ikuo Suyama
October 15, 2021
More Decks by Ikuo Suyama
See All by Ikuo Suyama
A Journey as Staff Engineer at SmartNews! 〜一年間の経験から語る、ICキャリアの今とこれから〜
martin_lover
1
1.2k
[zh-TW] DevOpsDays Taipei 2025 -- Creating Awesome Change in SmartNews!(machine translation)
martin_lover
1
1.4k
DevOpsDays Taipei 2025 -- Creating Awesome Change in SmartNews!
martin_lover
1
830
Creating Awesome Change in SmartNews! En
martin_lover
0
200
Creating Awesome Change in SmartNews
martin_lover
2
1.1k
Dive into JVM JIT Compiler
martin_lover
2
310
InvokeDynamic完全に理解した / Completely Understand InvokeDynamic
martin_lover
0
1.1k
10分で完全に理解するInvokeDynamic / 10min To Understand InvokeDynamic
martin_lover
0
900
High Performance FastAPI EN
martin_lover
0
1.2k
Other Decks in Programming
See All in Programming
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
260
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2k
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
580
Oxcを導入して開発体験が向上した話
yug1224
4
310
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
180
CSC307 Lecture 17
javiergs
PRO
0
320
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
250
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
250
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
540
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
680
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
4.5k
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
710
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Evolving SEO for Evolving Search Engines
ryanjones
0
220
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
The Curious Case for Waylosing
cassininazir
1
390
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
350
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Become a Pro
speakerdeck
PRO
31
6k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
380
Transcript
)JHI1FSGPSNBODF 'BTU"1* *LVP4VZBNB
ಃࢁҭஉ*LVP4VZBNB !NBSUJO@MPWFS@TF 4NBSU/FXT *OD ✤"ET#BDLFOE&OHJOFFS ✤Πϯλʔωοτࠂ͕ઐ ✤zࡾͷ൧ΑΓࠂ͕͖z ✤+7.͍ 1ZUIPOྺ͘Β͍ ✤͓खॊΒ͔ʹʜ🙇
͜ͷηογϣϯ͔ΒಘΒΕΔ͜ͱ ✤ ϓϩϑΝΠϦϯάख๏ͱϘτϧωοΫͷಛఆ ✤զʑͷڥͰൃੜͨ͠۩ମతͳ՝ͱͦͷରࡦ 1ZUIPO8FC"QQMJDBUJPO ύϑΥʔϚϯενϡʔχϯάͷ۩ମతͳख๏
λΠτϧ͔Β͔ΔΑ͏ʹ ͜ͷຊʹ େม͓ੈʹͳΓ·ͨ͠🙇
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
"CPVU4NBSU/FXT ݄ؒ 2,000ສਓ ɹɹɹར༻ऀ 116.7ར༻ ※2 1ਓ͋ͨΓ ʢ20198݄ ถ߹ࢉʣ
No.1 χϡʔεΞϓϦ Ϣʔβʔ※1 ੜ׆ऀͷʮຖͷश׳ʯ ຊ࠷େͷχϡʔεΞϓϦ ※1. Nielsen Mobile NetView 20211݄࣌ ʢεϚʔτχϡʔεͷར༻ऀΛΞϓϦέʔγϣϯϨϕϧͰूܭʣ ※2. ࣗࣾ20211݄ฏۉ
1ZUIPOJO4NBSU/FXT$PVQPO$IBOOFM OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%# 8FCαʔόʔʹ'BTU"1*Λ࠾༻
• 'MBTLMJLFͳΞϊςʔγϣϯϕʔεͷϧʔςΟϯά"1* • 0QFO"1*ରԠ • ؆қతͳ%*ػೳ • ֮͑Δ͜ͱ͕গͳ͘ɺૉૣ͘։ൃΛ্ཱͪ͛ΒΕΔ l'BTU"1*ɺ1ZUIPOͷඪ४Ͱ͋Δܕώϯτʹج͍ͮͯ 1ZUIPOҎ߱Ͱ"1*Λߏங͢ΔͨΊͷɺ
ϞμϯͰɺߴ ߴύϑΥʔϚϯε ͳɺ8FCϑϨʔϜϫʔΫͰ͢ɻz 'BTU"1* αʔϏεͷਝͳ্ཱͪ͛Λ࣮ݱʂ
'BTU"1*ඦฉҰߦʹ͔ͣ
1IBTFE3PMMPVUʜ OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%#
'VMMZ3PMMPVU OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%# εϚχϡʔͷશྗʂʂ
'VMMZ3PMMPVU OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%# εϚχϡʔͷશྗʂʂ 🔥 🔥
🔥 🔥
'VMMZ3PMMPVU OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%# εϚχϡʔͷશྗʂʂ 🔥 🔥
🔥 🔥 ύϑΥʔϚϯενϡʔχϯάͷཱྀʜ
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
ύϑΥʔϚϯενϡʔχϯάͷ৺ಘ ̍ɽੑೳඪΛܾΊΔ ̎ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ̏ɽϘτϧωοΫΛղফ͢Δ ੑೳඪΛୡͨ͠ʁ &/%🎉 :&4 /0
8FC"QQMJDBUJPOʹ͓͚Δʮੑೳʯ ඪ͕ͳ͍ͱແݶʹΓଓ͚ͯ͠·͏ʂ εϧʔϓοτ ୯Ґ࣌ؒʹͲΕ͘Β͍ͨ͘͞Μ ϦΫΤετΛ͚͞Δ͔ʁ ? ָ͗͢͠ΔͷͰ ϨΠςϯγ ̍ͭͷϦΫΤετʹ ͲΕ͘Β͍͕͔͔࣌ؒΔ͔ʁ
ɽੑೳඪΛܾΊΔ
-ʜฏۉͪϓϩηε Еʜ ୯Ґ࣌ؒ͋ͨΓ ౸ண 8ʜฏۉࡏ࣌ؒ 8FC"QQMJDBUJPOੑೳͷʹஔ͖͑Δͱʜ WIP(Parallerism) = Throughput ×
Latency L = λW Ϧτϧͷ๏ଇ ɽੑೳඪΛܾΊΔ
ྫɿ SQTͷγεςϜΛDPSFͰࡹ͖͍ͨ ɹDPSFͷΠϯελϯε ͋Δ͍1PET ΛฒΔͱͯ͠ ̍͋ͨΓSQTࡹ͚ྑ͍ͷͰ ͭ·Γ̍ΠϯελϯεͷੑೳඪΛ εϧʔϓοτSQT Ҏ্
ɺϨΠςϯγNT ҎԼ ɺͱઃఆ͢Δ 5(WIP)/100rps = 0.05s = 50ms ɿ࣮ࡍʹ$16Λ͍͖ΕΔΘ͚Ͱͳ͍͠ɺ*0$PODVSSFODZ͋Δ͠ɺ ,Tͷ1PEͰར༻Ͱ͖Δ$16ίΞͱMJNJU͕Ұக͠ͳ͍͠ɺ ʜͳͲͳͲͳͲͬͱෳࡶͰ͕͢ɺେମͷ҆ͱͯ͠ ੑೳඪͷܾΊํɿྫ ɽੑೳඪΛܾΊΔ
ϧʔϧϓϩάϥϜ͕Ͳ͜Ͱ࣌ؒΛফඅ͢Δ͜ͱʹͳΔ͔Δ͜ͱͰ͖ͳ͍ɻ ϘτϧωοΫڻ͖͘ՕॴͰى͜ΔͷͰ͋Δɻ ͕ͨͬͯ͠ɺͲ͕͜ϘτϧωοΫͳͷ͔Λ͖ͬΓͤ͞Δ·Ͱɺ ਪଌΛߦͬͨΓɺεϐʔυϋοΫΛͯ͠ͳΒͳ͍ɻ ϧʔϧܭଌ͢͠ɻܭଌ͢Δ·ͰͷͨΊͷௐΛͯ͠ͳΒͳ͍ɻ ίʔυͷҰ෦͕ΓΛѹ͠ͳ͍ͷͰ͋Εɺͳ͓͞ΒͰ͋Δɻ 3PC1JLF/PUFTPO1SPHSBNNJOHJO$ <8JLJQFEJB>ύΠΫ$ϓϩάϥϛϯάʹؔ͢Δ֮͑ॻ͖ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ϘτϧωοΫҎ֎νϡʔχϯάͯ͠ແବແବ
ਪଌ͢ΔͳܭଌͤΑ ܭଌͤͣϘτϧωοΫΛΔ͜ͱͰ͖ͳ͍͠ɺ
̍ɽੑೳඪΛܾΊΔ ̎ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ̏ɽϘτϧωοΫΛղফ͢Δ ੑೳඪΛୡͨ͠ʁ &/%🎉 :&4 /0 ෛՙΛ͔͚ͯ 4ZTUFNશମͷෛՙঢ়گΛ֬ೝ "QQMJDBUJPOͷෛՙঢ়گΛ֬ೝ
-PDBMͰͰ͖ΔݶΓಉ͡ঢ়گΛ࠶ݱ͠ɺ ෛՙΛ͔͚ͭͭܭଌ ϘτϧωοΫͷ ࠷ٙΘ͍͠ՕॴΛ͢ ϘτϧωοΫ͕ղফ͞Ε͔ͨʁ ੑೳ্͕͔ͨ͠ʁ ෛՙࢼݧڥʹ σϓϩΠͯ͠ܭଌ ϘτϧωοΫ "QQMJDBUJPO ෛՙࢼݧʹར༻Ͱ͖Δ ڥΛ४උ͢Δ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ "QQMJDBUJPO͕ ϘτϧωοΫʹͳΔ·Ͱमਖ਼ :&4 /0 :&4 /0 ܭଌͷखॱͱπʔϧͨͪ Datadog APM • fastapi_profiler • py-spy ϑΟʔυόοΫϧʔϓΛ ૣ͍ͨ͘͠
• 1ZUIPOͷ͍ΘΏΔϕϯνϚʔΫɾෛՙࢼݧπʔϧ • 1ZUIPO"1*ͰγφϦΦΛهड़ • γϯϓϧ͔ͭඞཁेͳઃఆ • ΫϥελԽͯ͠େ͖ͳෛՙʹରԠ -PDVTUJTBOFBTZUPVTF TDSJQUBCMFBOE
TDBMBCMFQFSGPSNBODFUFTUJOHUPPM -0$645 ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ෛՙΛ͔͚Δɿ-0$645
ෛՙΛ͔͚Δɿ-0$645 ಉ࣌ଓΛࢦఆ rps,median/95% tile latencyΛάϥϑԽ ಉ࣌ଓΛ૿͠ͳ͕ΒϨΠςϯγ͕ѱԽ͢Δݶք·ͰෛՙΛ͔͚ɺ ࠷େεϧʔϓοτͱͦͷ࣌ͷϨΠςϯγΛ֬ೝ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
• ෛՙΛ͔͚ͨঢ়ଶͰͷγεςϜશମͷϦιʔεঢ়گΛ֬ೝ • 2ΞϓϦέʔγϣϯ͕ϘτϧωοΫʹͳ͍ͬͯΔ͔ʁ • ϘτϧωοΫ͕ΞϓϦέʔγϣϯʹҠΔ·ͰɺΞϓϦέʔγϣϯͷνϡʔχϯά Λͯ͠ແବແବ • ͍͍ͩͨ%BUBCBTFͳͲͷϛυϧΣΞ͕ઌʹϘτϧωοΫʹͳΔ •
6QTUSFBNͷαʔϏεଓ͢ΔϛυϧΣΞͷϦιʔεʹ༨༟͕͋Δ͕ɺΞϓ Ϧέʔγϣϯͷεϧʔϓοτ্͕͕Βͳ͍ঢ়ଶ·Ͱνϡʔχϯά • ΞϓϦέʔγϣϯҎ֎ͷνϡʔχϯάࠓճׂѪ🙇 γεςϜશମͷෛՙঢ়گΛ֬ೝɿ%BUBEPH ҎޙͷΞϓϦέʔγϣϯ͕ϘτϧωοΫͰ͋Δલఏ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
αʔϏεຖͷϦΫΤετ CPU/MemoryͳͲͷར༻ঢ়گΛ֬ೝ ϛυϧΣΞͷCPU Usage ίωΫγϣϯͷมԽΛ֬ೝ ࡉ͔͍ঢ়گίϯςφʹBUUBDIͯ֬͠ೝͨ͠Γ͢Δ͕ɺ શମͷΛ௫Ήͷʹେมศར ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
• ηοτΞοϓ؆୯ɺαΠυΧʔͱߦͷىಈίʔυ • ࣮ࡍʹՔಇ͍ͯ͠ΔڥͰͷσʔλ͕खʹೖΔ • ඞཁͳใେମἧ͓ͬͯΓɺϘτϧωοΫͷൃݟʹཱͭ ΞϓϦέʔγϣϯܭଌᶃɿ%BUBEPH"1. %BUBEPH"1.ͱ$POUJOVPVT1SPGJMFSɺ8FCαʔϏεɺΩϡʔɺσʔλϕʔε͕ ϦΫΤετɺΤϥʔɺϨΠςϯγʔΛࢹ͢ΔͨΊͷඪ४ͷύϑΥʔϚϯεμογϡ ϘʔυΛ༻ͯ͠ɺΞϓϦέʔγϣϯΛৄࡉʹՄࢹԽ͠·͢ɻ
%BUBEPH"1. ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ෛՙڥΞϓϦέʔγϣϯܭଌɿ%BUBEPH"1. Latency histgram CPU time by scripts CPU time
by function ͍͕ͭ͜Ұ൪࣌ؒΛ͓ͬͯΓɺ ϘτϧωοΫީิ ͕ͩߴ͍💸ɺಛఆͷΠϯελϯεͷΈʹదԠ͢ΔͳͲͷΛʜ
-PDBMΞϓϦέʔγϣϯܭଌᶃɿGBTUBQJ@QSPGJMFS ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ "'BTU"1*.JEEMFXBSFPGQZJOTUSVNFOUUP DIFDLZPVSTFSWJDFDPEFQFSGPSNBODF GBTUBQJ@QSPGJMFS • 'BTU"1*ϛυϧΣΞͱͯ͠QZJOTUSVNFOUΛ౷߹ • ϩʔΧϧͰίʔυΛमਖ਼ͭͭ͠ɺ$16࣌ؒΛܭଌ͢Δͱ͖ʹศར •
ύϑΥʔϚϯεӨڹ͕େ͖͍ͨΊɺຊ൪ෛՙঢ়گԼͰ͑ͳ͍
-PDBMΞϓϦέʔγϣϯܭଌᶃɿGBTUBQJ@QSPGJMFS ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ add_middleware ͢Δ͚ͩͰOK sortϝιου͕ ͍ʹϘτϧωοΫީิ
• 3VTUͷϓϩϑΝΠϥɺΦʔόʔϔου • ϩʔΧϧڥෛՙڥͰͬ͞ͱ$16Λܭଌ͍ͨ͠ͱ͖ʹศར • (*-ϚϧνεϨουॲཧͷϘτϧωοΫ͕ٙΘ͍͠ͱ͖ʹศར • GBTUBQJ@QSPGJMFSGBTUBQJཧԼʹͳ͍εϨουΛܭଌͰ͖ͳ͍ʜ -PDBMΞϓϦέʔγϣϯܭଌᶄɿQZTQZ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
*UMFUTZPVWJTVBMJ[FXIBUZPVS1ZUIPOQSPHSBN JTTQFOEJOHUJNFPOXJUIPVUSFTUBSUJOHUIF QSPHSBNPSNPEJGZJOHUIFDPEFJOBOZXBZ QZTQZ
͜ͷϝιου͕ΤϯυϙΠϯτ ॲཧͷຆͲͷ࣌ؒΛΊ͍ͯΔ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ -PDBMΞϓϦέʔγϣϯܭଌᶄɿQZTQZ
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
'BTU"1*ͷσϓϩΠ࣌ߏͱෛՙಛੑ (VOJDPSOTVQQPSUTXPSLJOHBTBQSPDFTTNBOBHFSBOEBMMPXJOHVTFSTUPUFMMJUXIJDITQFDJGJDXPSLFS QSPDFTTDMBTTUPVTF5IFO(VOJDPSOXPVMETUBSUPOFPSNPSFXPSLFSQSPDFTTFTVTJOHUIBUDMBTT "OE6WJDPSOIBTB(VOJDPSODPNQBUJCMFXPSLFSDMBTT 4FSWFS8PSLFST(VOJDPSOXJUI6WJDPSO <Process Manager> <ASGI Server> <ASGI
Framework> <Web Framework> ϓϩηεͷىಈͱGPSL TPDLFUΛXPSLFSʹ͢ ϦΫΤετϨεϙϯε ඇಉظॲཧ Request Response Func call callback Extends <Application> Worker ΞϓϦέʔγϣϯ ϏδωεϩδοΫ
'BTU"1*ͷσϓϩΠ࣌ߏͱෛՙಛੑ (VOJDPSOTVQQPSUTXPSLJOHBTBQSPDFTTNBOBHFSBOEBMMPXJOHVTFSTUPUFMMJUXIJDITQFDJGJDXPSLFS QSPDFTTDMBTTUPVTF5IFO(VOJDPSOXPVMETUBSUPOFPSNPSFXPSLFSQSPDFTTFTVTJOHUIBUDMBTT "OE6WJDPSOIBTB(VOJDPSODPNQBUJCMFXPSLFSDMBTT 4FSWFS8PSLFST(VOJDPSOXJUI6WJDPSO <Process Manager> <ASGI Server> <ASGI
Framework> <Web Framework> Request Response Func call callback Extends <Application> Worker ϓϩηεཧͷΈͳͷͰ ύϑΥʔϚϯεӨڹͳ͠ 4UBSMFUUFΑΓૣ ͘ͳΒͳ͍͕ 1ZUIPO"4(*ք ࠷ 4UBSMFUUFΑΓԼ͕ϘτϧωοΫʹͳΔ͜ͱࠓճͳ͔ͬͨ
*0CPVOEͳॲཧ͕͍ $16CPVOEͳॲཧ͕͍ .VMUJ5ISFBE͕͍ ॲཧܥͷมߋʹΑΔશମతͳੑೳ্ ̏ɽ໘ͨ͠՝
*0CPVOEͳॲཧ͕͍ ✤ ໘ͨ͠՝ 3FEJTͷSFBEΞΫηε͕͍ ✤ ঢ় • $16Λ͍ͬͯͳ͍ͷʹεϧʔϓοτ্͕͕Βͳ͍ •
UPQ WNTUBUͰDQVVTΛ֬ೝ ✤ ݪҼ • %#ΞΫηεͳͲɺωοτϫʔΫ*0Λཁ͢Δॲཧ • ϑΝΠϧॻ͖ࠐΈ
• ωοτϫʔΫ͕བྷΉͱ͜ΖBTZODBXBJUΛ͏ • ରԠϥΠϒϥϦଟ͍ • FHBJPSFEJTIUUQYʜ *0CPVOE3FEJTΞΫηε͕͍ ରࡦᶃɿBDZODJPΛ͏ BTZODJPBTZODBXBJUߏจΛ͍ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦͰ͢ɻ
BTZODJP
ରࡦᶃɿBDZODJPΛ͏ fastAPIͰϧʔςΟϯά ϝιουΛasyncʹ͢Δ͚ͩ async method ͷ෦Ͱawait *0CPVOE3FEJTΞΫηε͕͍
• ͦΕͰωοτϫʔΫ͕བྷΉͱ͜ΖجຊతʹΊͪΌ͍ • ϝϞϦࢀরͱൺΔͱdഒ͕͔͔ۙ࣌ؒ͘Δ • ݁Ռ߹ੑͷڐ༰͕ߴ͍߹ɺΞϓϦέʔγϣϯϝϞϦʹऔ ಘͨ݁͠ՌΛΩϟογϡ͢Δ ରࡦᶄɿDBDIF͢Δ Latency Comparison
Numbers (~2012) ---------------------------------- : Main memory reference 100 ns : Round trip within same datacenter 500,000 ns 500 us — Latency Numbers Every Programmer Should Know *0CPVOE3FEJTΞΫηε͕͍
3FEJTΞΫηε͕͍ʜରࡦᶄɿDBDIF͢Δ OrderedDictΛར༻ͨ͠ ؆қͳLRUCache Cache͕ͳ͔ͬͨ߹ͷΈ RedisʹΞΫηε method͝ͱΩϟγϡͯ͘͠ΕΔ lru_cacheΞϊςʔγϣϯศར *0CPVOE3FEJTΞΫηε͕͍
✤ ໘ͨ͠՝ 63-Τϯίʔυॲཧ͕͍ ҐஔใͷHFPIBTIͷܭࢉ͕͍ Ґஔใ͔Βͷڑͷܭࢉ͕͍ ✤ ঢ়
• UPQ WNTUBUͰVTFSUJNF͕ுΓ͘ɺ-"͕ߴ͍ • LTڥͰ͋Ε5ISPUUMF͞ΕΔ ✤ ओͳݪҼ • ුಈখܭࢉͳͲγϯϓϧʹॏ͍ܭࢉ • ඇޮͳΞϧΰϦζϜ $16CPVOEͳॲཧ͕͍
ରࡦɿࣄલܭࢉDBDIF͢Δ τϥϯβΫγϣϯ͝ͱʹ݁Ռ͕มΘΒͳ͍ͷ ΦϑϥΠϯͰࣄલʹܭࢉ͓͔ͯ͘͠ɺ ܭࢉ݁ՌΛDBDIF͢Δ͜ͱͰॏ͍ܭࢉࣗମΛόΠύε͢Δ urllib/parse.py Ͱଟ͘ͷ࣌ؒΛ͍ͬͯΔ Urlͷܭࢉ݁ՌΛ Cache͢Δ $16CPVOE63-Τϯίʔυॲཧ
• ϦΫΤετ͝ͱʹΦϯϥΠϯͰܭࢉ͠ͳ͚ΕͳΒͣɺ͔ͭܭࢉෛՙͷ ߴ͍ͷ • (FPIBTIʜҐஔใ MBUMPO ΛಛఆͷྖҬ͝ͱʹIBTIԽ͢Δ • $ݴޠͳͲͷਫ४ݴޠʹ༧ΊίϯύΠϧͯ͠͠·͏ •
ؔ͝ͱͳͲɺ෦తʹదԠ͢Δ͜ͱ͕Մೳ ରࡦɿ$ZUIPO $ZUIPOJTBOPQUJNJTJOHTUBUJDDPNQJMFSGPSCPUIUIF1ZUIPO QSPHSBNNJOHMBOHVBHFBOEUIFFYUFOEFE$ZUIPO QSPHSBNNJOHMBOHVBHF $ZUIPO $16CPVOEHFPIBTIͷܭࢉ͕͍
ࢦఆ͞ΕͨҐஔใ͔Β geohash(maptile)Λܭࢉ͢Δؔ .pyxʹॻ͍ͯίϯύΠϧ͢Δ ݺͼग़͠ଆ௨ৗͷPythonͱಉ͡ ͜Μͳײ͡ͷ setup.pyΛ४උͯ͠ docker build͢Δͱ͖ʹ ίϯύΠϧ͍ͯ͠Δ ରࡦɿ$ZUIPO
$16CPVOEHFPIBTIͷܭࢉ͕͍
• ϦΫΤετͷҐஔใͱɺۙ͘ͷΫʔϙϯͱͷڑͷܭࢉ • ۙ͘ʹ͋ΔΫʔϙϯͷ͚ͩϧʔϓͯ͠ܭࢉ͍ͯͨ͠ • ϧʔϓॲཧΛɺOVNQZͷϕΫτϧܭࢉΛ༻͍ͯ$16DBDIFͷར༻Λ࠷దԽ͢Δ • $16$BDIF͔Βͷϩʔυ3".ΑΓང͔ʹߴ ରࡦɿOVNQZ $16CPVOEڑͷܭࢉ͕͍
Latency Comparison Numbers (~2012) ---------------------------------- L1 cache reference 0.5 ns L2 cache reference 7 ns 14x L1 cache : Main memory reference 100 ns 20x L2 cache, 200x L1 cache — Latency Numbers Every Programmer Should Know
ϕΫτϧԽͯ͠ɺ ҎޙͷܭࢉϕΫτϧܭࢉ ϦΫΤετͷҐஔใͱͦΕͧΕͷ ΫʔϙϯͷڑΛ ΦϯϥΠϯͰܭࢉ͍ͨ͠ ରࡦɿOVNQZ $16CPVOEڑͷܭࢉ͕͍
.VMUJ5ISFBE͕͍ ✤ ໘ͨ͠՝ -PHHJOH͕͍ ✤ ঢ় • 'BTU"1*Ҏ֎ͷ5ISFBEͰ$16Λ͍ͬͯΔ •
%BUBEPH"1.Ͱ֬ೝ • QZTQZUPQͰ(*-ͷ͕͍ ✤ ݪҼ • ࠓճMPHSVͱ͍͏ϥΠϒϥϦ͕.VMUJ5ISFBEͰϩάΛॻ͍͍ͯͯɺͦ ͜ʹ͕͔͔͍࣌ؒͬͯͨ • 1ZUIPO5ISFBEΛѻ͑Δ͕ɺ(*-͕͋ΔͨΊޮ͕ѱ͍
.VMUJ5ISFBE͕͍ *O$1ZUIPO UIFHMPCBMJOUFSQSFUFSMPDL PS(*- JTBNVUFY UIBUQSPUFDUTBDDFTTUP1ZUIPOPCKFDUT QSFWFOUJOHNVMUJQMF UISFBETGSPNFYFDVUJOH1ZUIPOCZUFDPEFTBUPODF (MPCBM*OUFSQSFUFS-PDL (*-(MPCBM*OUFSQSFUFS-PDL
• 5ISFBEΛཱͯͯಉ࣌ʹ࣮ߦ͞ΕΔͷϓϩηεͰ̍ͭ • 1ZUIPOͰฒྻॲཧ.VJUM1SPDFTTJOH ͜Εʹฒߦॲཧ BTZODJPΛΈ߹Θͤͯରॲ͢Δ
.VMUJ5ISFBE͕͍ LogใͷγϦΞϥΠζͱ emmitʹ͕͔͔͍࣌ؒͬͯΔ Queue͔Βऔಘͯ͠σγ ϦΞϥΠζ͍ͯ͠Δ༷ _enqueue͕true(default) ͩͱɺSimpleQueueͱlogग़ྗ༻ ͷThreadΛͨͯΔ multiprocessing.SimpleQueue ͷ࣮ମProcessؒ௨৴ͷPipe
8SJUFS5ISFBEͱͷσʔλड͚͕ͦ͠͏
.VMUJ5ISFBE-PHHJOH͕͍ ରࡦɿϩΪϯάͷ੍ͱϥΠϒϥϦͷมߋ w GBTUMPHHJOHʹΓ͑ͨ w ͦͦ͜͜༰ྔͷେ͖͍MPHΛు͖͍͕ͨɺະղܾ
• ීஈ͍ͬͯΔ$1ZUIPOҎ֎ʹ༷ʑͳॲཧܥ͕͋Δ • ڃݴޠʹίϯύΠϧ͢Δͷɺ+*5ίϯύΠϥΛ࣋ͭͷɺFUDʜ • ࠓճͭΛࢼͯ͠ɺ1Z1ZΛ࠾༻ͨ͠ DJOEFS 1Z1Z
• $16͕ϘτϧωοΫͰ͋Εɺશମతͳੑೳ্͕ظͰ͖Δ ॲཧܥͷมߋʹΑΔશମతͳੑೳ্
ॲཧܥͷมߋDJOEFS $JOEFSJT*OTUBHSBNTJOUFSOBMQFSGPSNBODFPSJFOUFEQSPEVDUJPO WFSTJPOPG$1ZUIPO *UDPOUBJOTBOVNCFSPGQFSGPSNBODFPQUJNJ[BUJPOT JODMVEJOH CZUFDPEFJOMJOFDBDIJOH FBHFSFWBMVBUJPOPGDPSPVUJOFT ʜ DJOEFS •
'BDFCPPLۘͷύϑΥʔϚϯεվળ͞Εͨ$1ZUIPO • զʑͷڥͰɺ ఔͷੑೳ্͕ݟΒΕͨ • $1ZUIPOͱͷޓੑ͕ߴ͘ɺϥΠϒϥϦ΄ͱΜͲ͑Δ • ͕ɺࣗલͰϏϧυ͢Δඞཁ͕͋ͬͨΓ(JU)VC׆ൃͰͳ͔ͬͨΓυΩϡϝϯτ͕օແͩͬͨ Γͱɺӡ༻໘ͰͭΒ͘அ೦
ॲཧܥͷมߋ1Z1Z "GBTU DPNQMJBOUBMUFSOBUJWFJNQMFNFOUBUJPOPG1ZUIPO 0OBWFSBHF 1Z1ZJTUJNFTGBTUFS UIBO$1ZUIPO 1Z1Z • +*5ίϯύΠϥ*ODNJOJNBSL($
• $1ZUIPOͱͷޓੑ͔ͳΓߴ͍ • ͪΖΜσϝϦοτͦΕͳΓʹ͋Δ • ͕ɺੑೳ໘ͰͷϝϦοτ͕େ͖͔ͬͨͨΊɺݱࡏຊ൪Քಇத • ͍ۙੑೳ্Λ֬ೝ
ۜͷؙͰͳ͍ ✤ ࡌͤସ͑ɾӡ༻ʹ͋ͨͬͯ໘ͨ͠՝ ࠷৽൛͕1ZUIPO Ұ෦ͷϥΠϒϥϦ͕͑ͳ͍ ($0QUJPOࢦఆ࿙ΕͰ00.ࢮ
'BTU"1*ͱͷΈ߹ΘͤͰϝϞϦϦʔΫʁ ॲཧܥͷมߋ1Z1Z
՝ᶃɿ࠷৽൛͕1ZUIPO ✤ ՝ɿݱࡏͷ࠷৽൛͕1ZUIPO • CFUB DPNNJOHTPPO ✤ ରԠ • ϕʔεͰ։ൃ͍ͯͨ͠ͷͰɺҰ෦ͷՕॴΛμϯάϨʔυ
• ηΠνԋࢉࢠ:= • Ґஔઐ༻Ҿdef huga(hoge, /, …) • ࣮࣭͋Μ·Γࠔ͍ͬͯͳ͍ ॲཧܥͷมߋ1Z1Z
՝ᶄɿҰ෦ͷϥΠϒϥϦ͕͑ͳ͍ ✤ ՝ɿ1&1֎෦ιʔεͷϏϧυΛ͏ϥΠϒϥϦ΄΅/( • FH • PSKTPOʜSVTUߴ+40/γϦΞϥΠβ😭 • EEUSBDFQZʜ%BUB%PH"1.ܭଌ༻😭 •
GBTUBQJQSPGJMFSʜ͜͜·Ͱେ׆༂ͷϓϩϑΝΠϥ😭 • CMBDL DBVTFECZUZQFEBTU ʜ-JOUFS'PSNBUUFS QZTFOܦ༝Ͱར༻😭 ✤ ରԠ • ผͷϥΠϒϥϦΛ͏ • ։ൃڥ༻ͱσϓϩΠ༻ͰผʑͷॲཧܥΛར༻͢Δ ॲཧܥͷมߋ1Z1Z
՝ᶄɿҰ෦ͷϥΠϒϥϦ͕͑ͳ͍ $1ZUIPOͰಈ͕͘1Z1ZͰಈ͔ͳ͍ͱ͍ͬͨෆ۩߹Λճආ͢ΔͨΊɺ $%ͷࡍʹຊ൪༻ίϯςφΛ༻͍ͯFFςετΛ࣮ࢪ͍ͯ͠Δ ։ൃ༻ / CPython3.7 CI্ͰͷUTͪ͜ΒͰ࣮ߦ ຊ൪༻ / PyPy3.7
ॲཧܥͷมߋ1Z1Z
՝ᶅɿ($0QUJPOࢦఆ࿙ΕͰ00.ࢮ ✤ ՝ɿϝϞϦ͕ϞϦϞϦ͠ɺ00.,JMMFSʹΑΓࢮ • 1Z1Zͷ($JODNJOJNBSL • ($0QUJPOͷઃఆ͕ඞཁ ✤ ରԠ •
1:1:@($@%(Λࢦఆͯ͠($-PHΛग़ྗ͢Δ • 1:1:@($@."9Λࢦఆͯ͠ώʔϓ্ݶΛ੍ݶ͢Δ ॲཧܥͷมߋ1Z1Z
՝ᶅɿ($0QUJPOࢦఆ࿙ΕͰ00.ࢮ MaxWorker x PYPY_GC_MAX Λ֬อ ࠷ݶ PYPY_GC_MAXࢦఆ ॲཧܥͷมߋ1Z1Z
՝ᶆɿ'BTU"1*ͱͷΈ߹ΘͤͰϝϞϦϦʔΫʁ ✤ ՝ɿϝϞϦ͕ϞϦϞϦ͠ɺ00.,JMMFSͰࢮʢ̎ʣ • &DIPαʔόʔͰɺෛՙΛ͔͚ΔͱϝϞϦ͕୯ௐ૿Ճ͢Δ • Ϧόϓϩ͍ͯͨ͠OHJOYͰ,FFQ"MJWF͍ͯ͠ͳ͔ͬͨʜ ✤ ରԠ •
)551ଓʢ%FGBVMU,FFQ"MJWFʣʹ͢Δͱղফͨ͠ • VWJDPSOͷUJNFPVULFFQBMJWFઃఆ͓ͯ͘͠ • ͋·Γਂ͍͍ͯ͠ͳ͍͕ɺDPOOFDUJPOपΓͷΆ͍ͷͰɺ 'BTU"1*ͱ͍͏ΑΓVWJDPSOͷ͔ ॲཧܥͷมߋ1Z1Z
̏ɽ໘ͨ͠՝ <5ISPVHIQVU> SQT <UJMF-BUFODZ> NT <5ISPVHIQVU> SQT ‐ <UJMF-BUFODZ>
NT ‐ ͯ͢ରԠͨ͠ޙɺΠϯελϯεͰͷੑೳվળ
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
·ͱΊ ✤ ෛՙςετͱϓϩϑΝΠϦϯά • ඪΛܾΊΔˠܭଌ͢ΔˠϘτϧωοΫʹରԠ͢Δ • ཱͭπʔϧͨͪɿMPDVTU EBUBEPH GBTUBQJQSPGJMFS QZTQZ
✤ ՝ͱରԠ • *0CPVOEBTZODJP DBDIF • $16CPVOEDBDIF $ZUIPO OVNQZ • ॲཧܥͷมߋ1Z1Z
)JHI1FSGPSNBODFͳ 'BTU"1*-JGFΛ
Thank You for Your Kind Attention! UXJUUFS!NBSUJO@MPWFS@TF