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
Creating the Fibonacci Sequence: Writing, Testi...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
onouyek
December 10, 2021
Programming
500
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Creating the Fibonacci Sequence: Writing, Testing, and Benchmarking Algorithms
【第4回】ゼロから始めるゲノム解析(Python編)
onouyek
December 10, 2021
More Decks by onouyek
See All by onouyek
Finding Open Reading Frames
onouyek
0
390
Inferring mRNA from Protein: Products and Reductions of Lists
onouyek
0
380
Finding the Longest Shared Subsequence: Finding K-mers, Writing Functions, and Using Binary Search
onouyek
0
300
Find a Motif in DNA: Exploring Sequence Similarity
onouyek
0
350
Finding the Hamming Distance: Counting Point Mutations
onouyek
0
460
Transcribing DNA into mRNA: Mutating Strings, Reading and Writing Files
onouyek
0
550
DNA methylation analysis using bisulfite sequencing data
onouyek
0
910
Operations on Genomic Intervals and Genome Arithmetic
onouyek
0
370
Exploratory Data Analysis with Unsupervised Machine Learning
onouyek
0
320
Other Decks in Programming
See All in Programming
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
17
6.2k
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.2k
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
460
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
120
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.8k
CSC307 Lecture 17
javiergs
PRO
0
320
プロパティの順序で型推論が壊れる!? TypeScript6.0の修正からContext-Sensitivityの仕組みを追う
bicstone
2
1.3k
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
230
LLM Plugin for Node-REDの利用方法と開発について
404background
0
160
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.5k
Featured
See All Featured
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
460
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
The Invisible Side of Design
smashingmag
302
52k
GraphQLとの向き合い方2022年版
quramy
50
15k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Optimizing for Happiness
mojombo
378
71k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
Transcript
【第4回】ゼロから始めるゲノム解析 (Python編) Creating the Fibonacci Sequence: Writing, Testing, and Benchmarking
Algorithms @onouyek
本勉強会の概要・目的 書籍名 対象者/目的 Mastering Python for Bioinformatics Python・バイオインフォ知識ほぼゼロの人 を対象に、正しいPythonのコーディング手 法について学ぶ
頻度 毎週〜隔週開催予定 登壇者 募集中!
Rosalindとは • 問題解決を通じてバイオインフォマティク ス、プログラミング、およびアルゴリズムを 学習するためのプラットフォーム • 大学やハッカソン、就職の面接にも 600回 以上の採用実績あり 参考:https://qiita.com/_kimoton/items/d534d0fa9b83dd7dc412
概要
環境構築 - 必要パッケージ群のインストール # 公開されているレポジトリからファイル群を取得 $ git clone https://github.com/kyclark/biofx_python $
cd biofx_python # requirements.txt に記載のパッケージをインストール $ pip3 install -r requirements.txt # pylintの設定ファイルをホームディレクトリに移動 $ cp pylintrc ~/.pylintrc # mypyの設定ファイルをホームディレクトリに移動 $ cp mypy.ini ~/.mypy.ini
本日のお題 http://rosalind.info/problems/fib/ 正の整数n(<=40)、k(<=5)が与えられる。1ペアから始めて、各世代において繁殖年齢のペアのウサギが kペ アのウサギの子孫を残すとしたとき、 nか月後に存在するウサギのペアの総数を求めよ。
本日学ぶこと • 引数の評価とエラーの出し方 • listのスタックとしての使い方 • ジェネレーター関数の書き方 • 再帰関数の書き方 •
メモ化を用いた高速化 • デコレーターの使い方
argparseの型チェック argparseのtypeにintを指定しておけば異なる型で入力されるとエラーになる $ ./fib.py 5 3.2 usage: fib.py [-h] generations
litter fib.py: error: argument litter: invalid int value: '3.2' $ ./fib.py -3 2 usage: fib.py [-h] generations litter fib.py: error: generations "-3" must be between 1 and 40 今回の問題の条件である 1<=n<=40、1<=k<=5を満たさない 場合にエラーを上げたい場合はどう すればよいか?
引数のバリデーション ①args.genはint型なので条件比較する ことができる ②条件に合わない場合は parse.error() でエラーを上げてプログラムを終了でき る ① ②
Solution 1: listをスタックとして用いる ①n=0、n=1のときのペア数0,1をスタックにいれておく ②n=2以降の計算結果(F n = F n-2 *litter
+ F n-1 )をスタックに追加 ③スタックに最後に入れた数が nヶ月後に存在するペア数 ① ② ③ スタック:LIFO (Last-In-First-Out) 1 3 2 1 3 2 Push Pop
Solution 2: ジェネレーター関数を使う ① ② ③ yieldを使うと関数の呼 び出しごとに結果が返 されるジェネレーターに なる
①x,yを0,1で初期化 ②1世代前の値を返す ③2世代前のxを1世代 前yのk倍に置き換え、1 世代前yを直近2世代の 和に置き換える x=0 y=1 yield x 0 0 x=0 y=1 yield y x=y*k=2 y=x+y=1 1 1 x=2 y=1 yield y x=y*k=2 y=x+y=3 1 2 x=2 y=3 yield y x=y*k=6 y=x+y=5 3 3 x=6 y=5 yield y x=y*k=10 y=x+y=11 5 4 x=10 y=11 yield y x=y*k=22 y=x+y=21 11 5 k=2の例
(参考)itertools.islice() for文の代わりにislice()を使えば、指定した 要素まで返すイテレーターが作られる islice(イテラブル, 要素数) リストにして最後の要素を取得
Solution 3-1: 再帰関数を使う ①終了条件:nが1または2になったら1を返す ②それ以外は2世代前と1世代前のfib()が呼ばれる 下図のようなスタックコールが作られていき計算される ① ② fib(5) fib(3)
fib(4) fib(2) fib(3) fib(1) fib(2) fib(1) fib(2)
Solution 3-2: メモ化による高速化 ① ② 毎回計算するのは効率が悪い ①空の辞書を作る ②辞書にない場合だけ計算する fib(5) fib(3)
fib(4) fib(2) fib(3) fib(1) fib(2) fib(1) fib(2)
Solution 3-3: メモ化(デコレーター) fib関数の上に@memoizeとすることでメモ化機 能を上書くことができる
Solution 3-4: functools.lru_cache() memoize関数を作らなくてもfunctoolsライブラリにlru_cache関数が使える
ベンチマークツール:hyperfine ①複数回実行した平均値がわかる ②サマリーで速度比較の結果がわかる demo ① ② https://github.com/sharkdp/hyperfine
randomを使ってランダム値でテストする ①random.choice()で与えられたシーケンスか らランダムに要素を返す ②random.randint(a, b)でa<=N<=bからラン ダムな整数を返す ① ② ① ②
makeコマンドからテストを実行する Makefileにテストコマンドを記述しておけばmake testでテストが実行できる
すべてのSolutionをまとめてテストする ①re.match()で正規表現にマッチする ファイルを取得 ②取得したファイルに対してテストを実行 ① ②
本日学んだこと • 引数のバリデーションとparser.error()によるエラーの上げ方 • listのスタックとしての使い方 • yieldを使ったジェネレーターの作成 • 再帰関数の書き方とメモ化による高速化 •
デコレーターの使い方 • hyperfineによるベンチマーキング • randomモジュールによる値のランダム生成