Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonの数学機能を学ぼう! その仕組も学ぼう!

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for curekoshimizu curekoshimizu
September 27, 2024
2.5k

Pythonの数学機能を学ぼう! その仕組も学ぼう!

Avatar for curekoshimizu

curekoshimizu

September 27, 2024
Tweet

More Decks by curekoshimizu

Transcript

  1. Profile : 眞鍋 秀悟 ( X: @curekoshimizu ) 略歴 •

    京都大学 / 大学院 ◦ 入試一位合格 ◦ 数学系 (多倍長数値計算を専門) [今回のお話と少し関係が深い] • Fixstars ◦ Executive Engineer • Mujin ◦ Architect • Preferred Networks ◦ Engineering Mananger • Hacobu ◦ 研究開発部部長・CTO室室長 • want.jp ◦ VPoP • [Now] Recustomer ◦ CTO かなり長い間 Pythonを 業務で使ってきた 2
  2. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 7
  3. Pythonが標準的に公開している数表現 1. 整数型 (int) 2. 浮動小数点数型 (float) 3. 複素数型 (complex)

    4. 10進多倍長演算型 (Decimal) 5. 有理数型 (Fraction) 本日は普段我々が最も使っているであろう、 int・floatという2つの型についてお話していく 12
  4. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 15
  5. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 25
  6. 整数型 (int) 整数を表すものが整数型 例. • 0 • 1 • 2

    • -5 • -32 • 123 • 10000000000000000000000000000000 26
  7. 整数型 (int) 整数を表すものが整数型 例. • 0 • 1 • 2

    • -5 • -32 • 123 • 10000000000000000000000000000000 今日はPythonの気持ちで 2つのグループに 分けてみましょう 27
  8. id 関数の実行結果例 (環境:Python3.12.6, x86-64) x id(x) 0 4354799288 1 4354799320

    2 4354799352 -5 4354799128 123 4354803224 -32 4342934352 10000000000000000000000000000000 4347138224 値がとても近い! 31
  9. id 関数の実行結果例2回目 (環境:Python3.12.6, x86-64) x id(x) 0 4354799288 1 4354799320

    2 4354799352 -5 4354799128 123 4354803224 -32 4342936240 10000000000000000000000000000000 4347135200 値が不変 値が変化 32
  10. id 関数の実行結果例3回目 (環境:Python3.12.6, x86-64) x id(x) 0 4354799288 1 4354799320

    2 4354799352 -5 4354799128 123 4354803224 -32 4342934352 10000000000000000000000000000000 4347136640 値が不変 値が変化 33
  11. 確かに何やらこういう分類がある気がしてきた • 0 • 1 • 2 • -5 •

    123 • -32 • 10000000000000000000000000000000 青グループ 赤グループ 34
  12. is関数のCPythonでの実装 is 関数というのはオブジェクトのPointerが一致しているかを確認している 先ほどの True・False・None や -5, -4, .., 255,

    256 という数は 初期化時に一度だけ生成されて、 それ以降はそのオブジェクトを使い回す。 そのため、これらのオブジェクトは isの比較をすることができる 38
  13. isによる比較ができるものとできないもの このように -5, -4, .., 255, 256 という数は is でも比較できてしまう特殊な実装

    になっている。 だから、idも同じ値を返していた。 注意. だからといって、数値型を is をつかって比較すべきではなく、= を使って 比較すべきである 40
  14. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 42
  15. PyObjectからの継承 PyObject PyLongObject : 整数型 PyComplexObject : 複素数型 PyFloatObject :

    浮動小数点数型 PyDecObject:10進数多倍長型 Fraction class :有理数 型 47
  16. PyObjectからの継承 PyObject PyLongObject : 整数型 PyComplexObject : 複素数型 PyFloatObject :

    浮動小数点数型 PyDecObject:10進数多倍長型 Fraction class :有理数 型 こちらをみていくことに! 48
  17. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 51
  18. Longという用語は Python2からの系譜 PyLongObject : 任意精度の整数 (python long integer object) PyIntObject

    : 固定長整数 Python2 PyLongObject Python3 統合 もはや対比的についていた名前 “long”は比べる相手がいなくなったのだが 名前としては残っている 53
  19. ob_digit という特徴 ob_digt[0] ob_digt[1] ob_digt[2] ob_digt[3] ob_digt[n-1] (必ず非0) ・・・ nが定まる

    大きい桁 メモリーが許す限りいくらでも大きな整数を表現できる 54
  20. メモリーの中身をみてみよう -5 -4 -3 -2 -1 0 1 int型の意味 参照カウント

    (最大値) の意味 SMALL_INT(-5, -4, …) は連続してメモリー上に生成されていた! type(...)で int が 返ってくる理由 59
  21. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 61
  22. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 64
  23. 浮動小数点数型 (PyFloatObject) PyObject PyLongObject : 整数型 PyComplexObject : 複素数型 PyFloatObject

    : 浮動小数点数型 PyDecObject:10進数多倍長型 Fraction class :有理数 型 こちら! 65
  24. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 68
  25. mathモジュールは PyFloatObject型のための計算機能 • acos • acosh • asin • asinh

    • atan • atan2 • atanh • cbrt • ceil • comb • copysign • cos • cosh • degrees • dist • e • erf • erfc • exp • exp2 • expm1 • fabs • factorial • floor • fmod • frexp • fsum • gamma • gcd • hypot • inf • isclose • isfinite • isinf • isnan • isqrt • lcm • ldexp • lgamma • log • log10 • log1p • log2 • modf • nan • nextafter • perm • pi • pow • prod • radians • remainder • sin • sinh • sqrt • tan • tanh • tau • trunc • ulp とてもたくさん! 69
  26. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 75
  27. GeForce RTX 4090 の単精度理論ピーク性能 を計算してみる (注. どんなアーキテクチャでもこの計算方法というわけではない) 16384 (Cores) ×

    2.52 (GHz) × 2 (FLOPS/CLOCK × Cores)) = 82.58TFLOPS 1度の計算で積和演算 (FMA) という 2回の浮動小数点計算をすることが 前提の「2」 積和演算がないと「1」になってしまう FLOPSとは 1秒間に何回浮動小数点の 計算ができるかの意味 82
  28. • Pythonにおける数値型について • 整数型について深堀り ◦ SMALL_INTの導入 ◦ CPythonにおける整数型の実装 ◦ 整数型と多倍長整数

    ◦ 四則演算について • 浮動小数点型について深堀り • math moduleの関数について深堀り ◦ 関数の呼び出し方 ◦ Python3.13とmath moduleの展望 • 最後に 本日お話をすること 86
  29. 本当は喋りたかったがスライドを作ってみた結果 時間の都合上入らなかった内容 • SMALL_INTだけではなくMEDIUM_INT・COMPACTについて • INTの多倍長整数演算の実装について • libmの中身の数学関数の実装について • Pythonのバイトコードへの展開と工夫について

    • 有理数型と浮動小数点数型など数値型の使い分けについて • 今回登場していたCPythonのデバッグ方法について • numpyの素晴らしさ (なぜ自前で行列計算ライブラリを実装してはいけないか) いつかこういうお話ができる機会があると 非常にうれしいです! 87