SlideShare ist ein Scribd-Unternehmen logo
1 von 23
Downloaden Sie, um offline zu lesen
アノテーションを利⽤して
簡易なロギングとキャッシュ
堀越保徳
⾃⼰紹介
• 堀越保徳
• 株式会社JDSC
• データサイエンティスト
• 本発表は話者の個⼈的⾒解を⽰すものであり
所属する組織の公式な⾒解ではないことをご
留意ください
• Twitter, GitHub: @hotoku
サマリ
• アノテーションを使って、
- 簡易にログ出⼒したり
- 計算結果をキャッシュする
パッケージを作ったので紹介させて下さい
$ pip install yuzu
例
例としてフィボナッチ数列を計算する関数を利⽤します
def fib(n):
if n in (1, 2):
return 1
return fib(n - 1) + fib(n - 2)
>>> fib(1), fib(2), fib(3), fib(4)
(1, 1, 2, 3)
ログ出⼒ ‒ 使い⽅
import logging
logging.basicConfig(level=logging.DEBUG)
LOGGER = logging.getLogger()
from yuzu import get_annotation
log = get_annotation(LOGGER)
@log()
def fib(n):
if n in (1, 2):
return 1
return fib(n - 1) + fib(n - 2)
import logging
logging.basicConfig(level=logging.DEBUG)
LOGGER = logging.getLogger()
from yuzu import get_annotation
log = get_annotation(LOGGER)
@log()
def fib(n):
if n in (1, 2):
return 1
return fib(n - 1) + fib(n - 2)
ログ出⼒ ‒ 使い⽅
標準loggingのロガーを準備
import logging
logging.basicConfig(level=logging.DEBUG)
LOGGER = logging.getLogger()
from yuzu import get_annotation
log = get_annotation(LOGGER)
@log()
def fib(n):
if n in (1, 2):
return 1
return fib(n - 1) + fib(n - 2)
ログ出⼒ ‒ 使い⽅
1. get_annotationでlogを作って
2. 関数定義を修飾する
ログ出⼒ ‒ 結果
〜略:前ページのコード〜
fib(3)
$ python main.py
INFO:root:fib [3] {} start (pid=66408)
INFO:root:fib [2] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib [1] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib end (pid=66408), value=2
先の関数定義の下で、fibを実⾏すると、以下のような
ログ出⼒が得られます。
main.pyとして保存して実⾏
ログ出⼒ ‒ 結果
〜略:前ページのコード〜
fib(3)
$ python main.py
INFO:root:fib [3] {} start (pid=66408)
INFO:root:fib [2] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib [1] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib end (pid=66408), value=2
先の関数定義の下で、fibを実⾏すると、以下のような
ログ出⼒が得られます。
main.pyとして保存して実⾏
ログ出⼒ ‒ 結果
〜略:前ページのコード〜
fib(3)
$ python main.py
INFO:root:fib [3] {} start (pid=66408)
INFO:root:fib [2] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib [1] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib end (pid=66408), value=2
先の関数定義の下で、fibを実⾏すると、以下のような
ログ出⼒が得られます。
main.pyとして保存して実⾏
ログ出⼒ ‒ 結果
〜略:前ページのコード〜
fib(3)
$ python main.py
INFO:root:fib [3] {} start (pid=66408)
INFO:root:fib [2] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib [1] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib end (pid=66408), value=2
先の関数定義の下で、fibを実⾏すると、以下のような
ログ出⼒が得られます。
main.pyとして保存して実⾏
ログ出⼒ ‒ 結果
〜略:前ページのコード〜
fib(3)
$ python main.py
INFO:root:fib [3] {} start (pid=66408)
INFO:root:fib [2] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib [1] {} start (pid=66408)
INFO:root:fib end (pid=66408), value=1
INFO:root:fib end (pid=66408), value=2
先の関数定義の下で、fibを実⾏すると、以下のような
ログ出⼒が得られます。
main.pyとして保存して実⾏
ログ出⼒ ‒ 便利機能
@log()
def add_column(df, val):
df["value"] = val
return df
add_column(df, 1)
引数や返り値の表⽰を抑制することができます
INFO:root:add_column [ x y z
0 0 0 0
∼ ∼ 中 略 ∼ ∼
99998 99998 99998 99998
99999 99999 99999 99999
[100000 rows x 3 columns], 1] {} start (pid=19904)
⾒ずらい例
ログ出⼒ ‒ 便利機能
@log(ignore_args=[0], return_value=False)
def add_column(df, val):
df["value"] = val
return df
add_column(df, 1)
引数や返り値の表⽰を抑制することができます
INFO:root:add_column [1] {} start (pid=20223)
INFO:root:add_column end (pid=20223)
ログ出⼒ ‒ 使い所
con = get_connection()
product_ids = load_product_ids(con)
for pid in product_ids:
rawdata = load_data(con, pid)
feature = process_data(pid, rawdata)
pred = predict(pid, feature)
save_data(ocn, pid, pred)
データ分析にありがちなコード
DBへの接続をgetして、商品IDを読んで、
⽣データを読んで、加⼯して、
予測して、保存
ログ出⼒ ‒ 使い所
con = get_connection()
product_ids = load_product_ids(con)
for pid in product_ids:
rawdata = load_data(con, pid)
feature = process_data(pid, rawdata)
pred = predict(pid, feature)
save_data(ocn, pid, pred)
こいつらのdefに@logを
付けておくと・・・
データ分析にありがちなコード
DBへの接続をgetして、商品IDを読んで、
⽣データを読んで、加⼯して、
予測して、保存
ログ出⼒ ‒ 使い所
2022-01-27 14:36:54,039 INFO get_connection [] {} start (pid
2022-01-27 14:36:54,039 INFO get_connection end (pid=60087),
2022-01-27 14:36:54,039 INFO load_product_ids [<__main__.Con
2022-01-27 14:36:54,039 INFO load_product_ids end (pid=60087
2022-01-27 14:36:54,039 INFO load_data [1] {} start (pid=600
2022-01-27 14:36:54,039 INFO load_data end (pid=60087)
2022-01-27 14:36:54,039 INFO process_data [1] {} start (pid=
2022-01-27 14:36:54,040 INFO process_data end (pid=60087)
2022-01-27 14:36:54,040 INFO predict [1] {} start (pid=60087
2022-01-27 14:36:54,040 INFO predict end (pid=60087)
2022-01-27 14:36:54,040 INFO save_data [1] {} start (pid=600
2022-01-27 14:36:54,040 INFO save_data end (pid=60087), valu
2022-01-27 14:36:54,040 INFO load_data [2] {} start (pid=600
2022-01-27 14:36:54,040 INFO load_data end (pid=60087)
2022-01-27 14:36:54,040 INFO process_data [2] {} start (pid=
2022-01-27 14:36:54,040 INFO process_data end (pid=60087)
2022-01-27 14:36:54,040 INFO predict [2] {} start (pid=60087
2022-01-27 14:36:54,040 INFO predict end (pid=60087)
2022-01-27 14:36:54,040 INFO save_data [2] {} start (pid=600
2022-01-27 14:36:54,040 INFO save_data end (pid=60087), valu
2022-01-27 14:36:54,040 INFO load_data [3] {} start (pid=600
2022-01-27 14:36:54,040 INFO load_data end (pid=60087)
2022-01-27 14:36:54,040 INFO process_data [3] {} start (pid=
キャッシュ ‒ 例
def fib(n):
if n in (1, 2):
return 1
return fib(n - 1) + fib(n - 2)
fib(100)
👆 ダメな例:fib(n)の計算はO(2^n)かかる
キャッシュ ‒ 例
from yuzu import cache
@cache()
def fib(n):
if n in (1, 2):
return 1
return fib(n - 1) + fib(n - 2)
fib(100)
⼀度、計算した結果はキャッシュされる
⇒ fib(n)の計算がO(n)で終わる
キャッシュ ‒ 使い所
キャッシュ ‒ 使い所
ノートブックを繰り返し実⾏
するときに便利
キャッシュ ‒ 使い所
キャッシュ判定の際に
特定の引数を無視できる
ご清聴ありがとうございました
https://github.com/hotoku/yuzu

Weitere ähnliche Inhalte

Was ist angesagt?

Boostライブラリ一周の旅
Boostライブラリ一周の旅 Boostライブラリ一周の旅
Boostライブラリ一周の旅
Akira Takahashi
 
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
Fuminobu TAKEYAMA
 
RのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたRのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみた
Kazuya Wada
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
 
R を起動するその前に
R を起動するその前にR を起動するその前に
R を起動するその前に
Kosei ABE
 

Was ist angesagt? (20)

ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 
Puppet入門
Puppet入門Puppet入門
Puppet入門
 
PostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLPostgreSQLとPythonとSQL
PostgreSQLとPythonとSQL
 
Boostライブラリ一周の旅
Boostライブラリ一周の旅 Boostライブラリ一周の旅
Boostライブラリ一周の旅
 
とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。
 
Python東海Vol.5 IPythonをマスターしよう
Python東海Vol.5 IPythonをマスターしようPython東海Vol.5 IPythonをマスターしよう
Python東海Vol.5 IPythonをマスターしよう
 
Box plot for annual income presentation using R
Box plot for annual income presentation using RBox plot for annual income presentation using R
Box plot for annual income presentation using R
 
Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定
 
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
 
RのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたRのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみた
 
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
 
XPagesで検索してみよう
XPagesで検索してみようXPagesで検索してみよう
XPagesで検索してみよう
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig
 
ldapvi & python-ldap で stress-free life
ldapvi & python-ldap で stress-free lifeldapvi & python-ldap で stress-free life
ldapvi & python-ldap で stress-free life
 
R を起動するその前に
R を起動するその前にR を起動するその前に
R を起動するその前に
 
Teclab3
Teclab3Teclab3
Teclab3
 
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...
 

Ähnlich wie Easy caching and logging package using annotation in Python

20100930 sig startups
20100930 sig startups20100930 sig startups
20100930 sig startups
Ichiro Fukuda
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
Yasuhiro Ishii
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
 
はじめてのPython
はじめてのPythonはじめてのPython
はじめてのPython
Katsumi Honda
 

Ähnlich wie Easy caching and logging package using annotation in Python (20)

20100930 sig startups
20100930 sig startups20100930 sig startups
20100930 sig startups
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)
 
PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
 
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
はじめてのPython
はじめてのPythonはじめてのPython
はじめてのPython
 
RGtk2入門
RGtk2入門RGtk2入門
RGtk2入門
 

Easy caching and logging package using annotation in Python

  • 2. ⾃⼰紹介 • 堀越保徳 • 株式会社JDSC • データサイエンティスト • 本発表は話者の個⼈的⾒解を⽰すものであり 所属する組織の公式な⾒解ではないことをご 留意ください • Twitter, GitHub: @hotoku
  • 3. サマリ • アノテーションを使って、 - 簡易にログ出⼒したり - 計算結果をキャッシュする パッケージを作ったので紹介させて下さい $ pip install yuzu
  • 4. 例 例としてフィボナッチ数列を計算する関数を利⽤します def fib(n): if n in (1, 2): return 1 return fib(n - 1) + fib(n - 2) >>> fib(1), fib(2), fib(3), fib(4) (1, 1, 2, 3)
  • 5. ログ出⼒ ‒ 使い⽅ import logging logging.basicConfig(level=logging.DEBUG) LOGGER = logging.getLogger() from yuzu import get_annotation log = get_annotation(LOGGER) @log() def fib(n): if n in (1, 2): return 1 return fib(n - 1) + fib(n - 2)
  • 6. import logging logging.basicConfig(level=logging.DEBUG) LOGGER = logging.getLogger() from yuzu import get_annotation log = get_annotation(LOGGER) @log() def fib(n): if n in (1, 2): return 1 return fib(n - 1) + fib(n - 2) ログ出⼒ ‒ 使い⽅ 標準loggingのロガーを準備
  • 7. import logging logging.basicConfig(level=logging.DEBUG) LOGGER = logging.getLogger() from yuzu import get_annotation log = get_annotation(LOGGER) @log() def fib(n): if n in (1, 2): return 1 return fib(n - 1) + fib(n - 2) ログ出⼒ ‒ 使い⽅ 1. get_annotationでlogを作って 2. 関数定義を修飾する
  • 8. ログ出⼒ ‒ 結果 〜略:前ページのコード〜 fib(3) $ python main.py INFO:root:fib [3] {} start (pid=66408) INFO:root:fib [2] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib [1] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib end (pid=66408), value=2 先の関数定義の下で、fibを実⾏すると、以下のような ログ出⼒が得られます。 main.pyとして保存して実⾏
  • 9. ログ出⼒ ‒ 結果 〜略:前ページのコード〜 fib(3) $ python main.py INFO:root:fib [3] {} start (pid=66408) INFO:root:fib [2] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib [1] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib end (pid=66408), value=2 先の関数定義の下で、fibを実⾏すると、以下のような ログ出⼒が得られます。 main.pyとして保存して実⾏
  • 10. ログ出⼒ ‒ 結果 〜略:前ページのコード〜 fib(3) $ python main.py INFO:root:fib [3] {} start (pid=66408) INFO:root:fib [2] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib [1] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib end (pid=66408), value=2 先の関数定義の下で、fibを実⾏すると、以下のような ログ出⼒が得られます。 main.pyとして保存して実⾏
  • 11. ログ出⼒ ‒ 結果 〜略:前ページのコード〜 fib(3) $ python main.py INFO:root:fib [3] {} start (pid=66408) INFO:root:fib [2] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib [1] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib end (pid=66408), value=2 先の関数定義の下で、fibを実⾏すると、以下のような ログ出⼒が得られます。 main.pyとして保存して実⾏
  • 12. ログ出⼒ ‒ 結果 〜略:前ページのコード〜 fib(3) $ python main.py INFO:root:fib [3] {} start (pid=66408) INFO:root:fib [2] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib [1] {} start (pid=66408) INFO:root:fib end (pid=66408), value=1 INFO:root:fib end (pid=66408), value=2 先の関数定義の下で、fibを実⾏すると、以下のような ログ出⼒が得られます。 main.pyとして保存して実⾏
  • 13. ログ出⼒ ‒ 便利機能 @log() def add_column(df, val): df["value"] = val return df add_column(df, 1) 引数や返り値の表⽰を抑制することができます INFO:root:add_column [ x y z 0 0 0 0 ∼ ∼ 中 略 ∼ ∼ 99998 99998 99998 99998 99999 99999 99999 99999 [100000 rows x 3 columns], 1] {} start (pid=19904) ⾒ずらい例
  • 14. ログ出⼒ ‒ 便利機能 @log(ignore_args=[0], return_value=False) def add_column(df, val): df["value"] = val return df add_column(df, 1) 引数や返り値の表⽰を抑制することができます INFO:root:add_column [1] {} start (pid=20223) INFO:root:add_column end (pid=20223)
  • 15. ログ出⼒ ‒ 使い所 con = get_connection() product_ids = load_product_ids(con) for pid in product_ids: rawdata = load_data(con, pid) feature = process_data(pid, rawdata) pred = predict(pid, feature) save_data(ocn, pid, pred) データ分析にありがちなコード DBへの接続をgetして、商品IDを読んで、 ⽣データを読んで、加⼯して、 予測して、保存
  • 16. ログ出⼒ ‒ 使い所 con = get_connection() product_ids = load_product_ids(con) for pid in product_ids: rawdata = load_data(con, pid) feature = process_data(pid, rawdata) pred = predict(pid, feature) save_data(ocn, pid, pred) こいつらのdefに@logを 付けておくと・・・ データ分析にありがちなコード DBへの接続をgetして、商品IDを読んで、 ⽣データを読んで、加⼯して、 予測して、保存
  • 17. ログ出⼒ ‒ 使い所 2022-01-27 14:36:54,039 INFO get_connection [] {} start (pid 2022-01-27 14:36:54,039 INFO get_connection end (pid=60087), 2022-01-27 14:36:54,039 INFO load_product_ids [<__main__.Con 2022-01-27 14:36:54,039 INFO load_product_ids end (pid=60087 2022-01-27 14:36:54,039 INFO load_data [1] {} start (pid=600 2022-01-27 14:36:54,039 INFO load_data end (pid=60087) 2022-01-27 14:36:54,039 INFO process_data [1] {} start (pid= 2022-01-27 14:36:54,040 INFO process_data end (pid=60087) 2022-01-27 14:36:54,040 INFO predict [1] {} start (pid=60087 2022-01-27 14:36:54,040 INFO predict end (pid=60087) 2022-01-27 14:36:54,040 INFO save_data [1] {} start (pid=600 2022-01-27 14:36:54,040 INFO save_data end (pid=60087), valu 2022-01-27 14:36:54,040 INFO load_data [2] {} start (pid=600 2022-01-27 14:36:54,040 INFO load_data end (pid=60087) 2022-01-27 14:36:54,040 INFO process_data [2] {} start (pid= 2022-01-27 14:36:54,040 INFO process_data end (pid=60087) 2022-01-27 14:36:54,040 INFO predict [2] {} start (pid=60087 2022-01-27 14:36:54,040 INFO predict end (pid=60087) 2022-01-27 14:36:54,040 INFO save_data [2] {} start (pid=600 2022-01-27 14:36:54,040 INFO save_data end (pid=60087), valu 2022-01-27 14:36:54,040 INFO load_data [3] {} start (pid=600 2022-01-27 14:36:54,040 INFO load_data end (pid=60087) 2022-01-27 14:36:54,040 INFO process_data [3] {} start (pid=
  • 18. キャッシュ ‒ 例 def fib(n): if n in (1, 2): return 1 return fib(n - 1) + fib(n - 2) fib(100) 👆 ダメな例:fib(n)の計算はO(2^n)かかる
  • 19. キャッシュ ‒ 例 from yuzu import cache @cache() def fib(n): if n in (1, 2): return 1 return fib(n - 1) + fib(n - 2) fib(100) ⼀度、計算した結果はキャッシュされる ⇒ fib(n)の計算がO(n)で終わる