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

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

curekoshimizu
September 27, 2024
1.5k

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

curekoshimizu

September 27, 2024
Tweet

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