goo blog サービス終了のお知らせ 

coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

Raspberry Pi に Python 3.13.7 をインストールする。

2025-08-25 21:44:54 | Python
Python 3.13.6 の公開から10日もたたない 8月14日(日本時間8月15日)に 3.13.7 がリリースされました。

ここから======
これはPython 3.13の7番目のメンテナンスリリースです。

Python 3.13はプログラミング言語Pythonの最新のメジャーリリースで、Python 3.12と比較して多くの新機能と最適化が含まれています。3.13.7 は 3.13 の 7 回目のメンテナンスリリースです。
3.13.7 は 3.13.6 リリースの重大な問題を修正するための簡易リリースです:
gh-137583: 3.13.5と3.13.6の間のsslモジュールのリグレッション: TLSで暗号化された接続からの読み込みがブロックされる
他にもいくつかのバグフィックス(次のリリースまで待たねばならないもの)が含まれています。
======ここまで (DeepL による翻訳)


これは完全に緊急のバグフィックスで、

Regression in ssl module between 3.13.5 and 3.13.6: reading from a TLS-encrypted connection blocks #137583
https://github.com/python/cpython/issues/137583

なるべく早く 3.13.6 から 3.13.7 へアップデートする必要がありますね。早速アップデートしてみましょう。

https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tar.xz
https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tar.xz.asc
MD5 Sum: 256cdb3bbf45cdce7499e52ba6c36ea3

ダウンロードしてチェックします。

$ wget https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tar.xz
--2025-08-24 10:26:37-- https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tar.xz
Resolving www.python.org (www.python.org)... 2a04:4e42::223, 2a04:4e42:200::223, 2a04:4e42:400::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22769492 (22M) [application/octet-stream]
Saving to: ‘Python-3.13.7.tar.xz’

Python-3.13.7.tar.x 100%[===================>] 21.71M 11.0MB/s in 2.0s

2025-08-24 10:26:40 (11.0 MB/s) - ‘Python-3.13.7.tar.xz’ saved [22769492/22769492]

$

$ wget https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tar.xz.asc
--2025-08-24 10:28:06-- https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tar.xz.asc
Resolving www.python.org (www.python.org)... 2a04:4e42:200::223, 2a04:4e42:400::223, 2a04:4e42:600::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42:200::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 963 [application/octet-stream]
Saving to: ‘Python-3.13.7.tar.xz.asc’

Python-3.13.7.tar.x 100%[===================>] 963 --.-KB/s in 0s

2025-08-24 10:28:06 (20.2 MB/s) - ‘Python-3.13.7.tar.xz.asc’ saved [963/963]

$

$ gpg --verify Python-3.13.7.tar.xz.asc
gpg: assuming signed data in 'Python-3.13.7.tar.xz'
gpg: Signature made Thu 14 Aug 2025 14:49:02 BST
gpg: using RSA key 7169605F62C751356D054A26A821E680E5FA6305
gpg: Good signature from "Thomas Wouters <thomas@python.org>" [unknown]
gpg: aka "Thomas Wouters <thomas@xs4all.nl>" [unknown]
gpg: aka "Thomas Wouters <twouters@google.com>" [unknown]
gpg: aka "Thomas Wouters <thomas.wouters.prive@gmail.com>" [unknown]
gpg: aka "Thomas Wouters <thomaswout@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7169 605F 62C7 5135 6D05 4A26 A821 E680 E5FA 6305
$

$ md5sum Python-3.13.7.tar.xz;echo 256cdb3bbf45cdce7499e52ba6c36ea3
256cdb3bbf45cdce7499e52ba6c36ea3 Python-3.13.7.tar.xz
256cdb3bbf45cdce7499e52ba6c36ea3
$

展開してビルドします。

$ tar xvf Python-3.13.7.tar.xz

$ cd Python-3.13.7

$ ./configure --prefix=/usr/local/python --with-readline --enable-shared --enable-optimizations
checking build system type... aarch64-unknown-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking for Python interpreter freezing... ./_bootstrap_python
checking for python3.13... python3.13
checking Python for regen version... Python 3.13.6
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes

.......................................................

configure: creating Modules/Setup.local
configure: creating Makefile
$

$ make
Running code to generate profile data (this can take a while):
# First, we need to create a clean build with profile generation
# enabled.
make profile-gen-stamp
make[1]: Entering directory '/home/espiya/src/Python-3.13.7'
make clean
make[2]: Entering directory '/home/espiya/src/Python-3.13.7'

......................................................

The necessary bits to build these optional modules were not found:
_dbm
To find the necessary bits, look in configure.ac and config.log.

Checked 112 modules (33 built-in, 77 shared, 1 n/a on linux-aarch64, 0 disabled, 1 missing, 0 failed on import)
make[1]: Leaving directory '/home/espiya/src/Python-3.13.7'

real 51m31.223s
user 48m45.083s
sys 1m38.693s
$


いつものように時間がかかりましたがビルドできたので、/usr/local/python にインストールします。

$ su
# make install



......................................................
Requirement already satisfied: pip in /usr/local/python/lib/python3.13/site-packages (25.2)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
#
# exit
$

無事にインストールできました。

$ python3
Python 3.13.7 (main, Aug 24 2025, 11:28:04) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()

$
$ pip3 --version
pip 25.2 from /home/espiya/.local/lib/python3.13/site-packages/pip (python 3.13)
$

(pip3 はこの間アップデートしたのでそのままでした。)

さて、今回の重大なバグ #137583 ですが、初心者なのでバグレポートを読んでもピンときません。そこで生成AI Gemini に聞いてみました。プロンプトは、

「Pythonのバグレポート#137583で、SSLモジュールのTLS関連で深刻なバグがあるみたいですが、具体的な影響を分かりやすく教えてください。バグの表題は「Regression in ssl module between 3.13.5 and 3.13.6 : reding from a TLS-encrypted connection blocks」です。」 

にしました。

ここで、回答が出てきて最後にあった詳細なサーチを更に行い、提示されたリサーチ計画から 「リサーチを開始」をクリックして作成された内容を、最後に「Googleドキュメントにエクスポート」をクリックして得られたファイルを Libre Office で印刷してみました。その表題は、

「Python 3.13.6 におけるTLS接続ブロッキング・バグに関する専門家報告書」

となっていて、これが中々読み応えのある内容でした。このバグがあると、SSLを使っているとデッドロックになることがあるようです。この現象が起こったときこの文書の中で

「このバグの最も危険な点は、その症状が「サイレントなフリーズ」であることです。」

と言っていて、

「バグの再現スクリプトが示すように、recv()の呼び出しが「永遠に」ブロックされるため、プログラムはクラッシュするのではなく、単に待機状態から抜け出せなくなります。」

とこのバグのせいと分かりにくいことが述べられていて、3.13.6 はすぐに 3.13.7 にする必要があることが分かりました。

長いので詳細は省略しますが、つい最近 8月14日に公開された 3.13.7 のアップデートに対して記されていた内容で、一般にはほとんど知られていない情報?であるにも関わらず、引用文献もそれなりに提示されているこのような長いレポート(A4 8ページ)を生成AIだけで作れてしまうようになったのだなと感銘を受けました。

現在は、生成AIが作成した Googleドキュメント形式(Geminiなので)のファイルによるこの手のレポートが普通に出回ってくると認識しておく必要があると、今回のPythonのアップデートで分かりました。
コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Raspberry Pi に Python 3.13.6 をインストールする。

2025-08-08 09:04:41 | Python
PHP 719 のスケ-ジュールにしたがって8月6日(日本時間は7日)にPython 3.13.6 がリリースされました。Firefoxの翻訳によれば、

ここから======
Python 3.13 のメンテナンスリリースは今回で6回目。

Python 3.13はPythonプログラミング言語の最新メジャーリリースであり、Python 3.12と比較して多くの新機能と最適化が含まれています。3.13.6 は 3.13 の 6 番目のメンテナンス リリースで、3.13.5 以降の約 200 のバグ修正、ビルドの改善、ドキュメントの変更が含まれています。
======ここまで


一日ずれた?ような気がしましたが、早速以下のファイルをダウンロードしてみます。

https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tar.xz
https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tar.xz.asc
MD5SUM: 4170b57e642c15a1dfed17313ec57cc2


$ wget https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tar.xz
--2025-08-07 15:07:40-- https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tar.xz
Resolving www.python.org (www.python.org)... 2a04:4e42:200::223, 2a04:4e42:400::223, 2a04:4e42:600::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42:200::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22761268 (22M) [application/octet-stream]
Saving to: ‘Python-3.13.6.tar.xz’

Python-3.13.6.tar.x 100%[===================>] 21.71M 11.0MB/s in 2.0s

2025-08-07 15:07:42 (11.0 MB/s) - ‘Python-3.13.6.tar.xz’ saved [22761268/22761268]

$

$ wget https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tar.xz.asc
--2025-08-07 15:08:41-- https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tar.xz.asc
Resolving www.python.org (www.python.org)... 2a04:4e42:200::223, 2a04:4e42:400::223, 2a04:4e42:600::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42:200::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 963 [application/octet-stream]
Saving to: ‘Python-3.13.6.tar.xz.asc’

Python-3.13.6.tar.x 100%[===================>] 963 --.-KB/s in 0s

2025-08-07 15:08:41 (20.2 MB/s) - ‘Python-3.13.6.tar.xz.asc’ saved [963/963]

$

ダウンロードしたファイルをチェックします。

$ gpg --verify Python-3.13.6.tar.xz.asc
gpg: assuming signed data in 'Python-3.13.6.tar.xz'
gpg: Signature made Wed 06 Aug 2025 16:18:28 BST
gpg: using RSA key 7169605F62C751356D054A26A821E680E5FA6305
gpg: Good signature from "Thomas Wouters <thomas@python.org>" [unknown]
gpg: aka "Thomas Wouters <thomas@xs4all.nl>" [unknown]
gpg: aka "Thomas Wouters <twouters@google.com>" [unknown]
gpg: aka "Thomas Wouters <thomas.wouters.prive@gmail.com>" [unknown]
gpg: aka "Thomas Wouters <thomaswout@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7169 605F 62C7 5135 6D05 4A26 A821 E680 E5FA 6305
$

$ md5sum Python-3.13.6.tar.xz ; echo 4170b57e642c15a1dfed17313ec57cc2
4170b57e642c15a1dfed17313ec57cc2 Python-3.13.6.tar.xz
4170b57e642c15a1dfed17313ec57cc2
$

展開していつもの手順でインストールします。

$ tar xvf Python-3.13.6.tar.xz

$ cd Python-3.13.6

$ ./configure --prefix=/usr/local/python --with-readline --enable-shared --enable-optimizations
checking build system type... aarch64-unknown-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking for Python interpreter freezing... ./_bootstrap_python
checking for python3.13... python3.13
checking Python for regen version... Python 3.13.5
................
configure: creating ./config.status
config.status: creating Makefile.pre
config.status: creating Misc/python.pc
config.status: creating Misc/python-embed.pc
config.status: creating Misc/python-config.sh
config.status: creating Modules/Setup.bootstrap
config.status: creating Modules/Setup.stdlib
config.status: creating Modules/ld_so_aix
config.status: creating pyconfig.h
configure: creating Modules/Setup.local
configure: creating Makefile
$

このようにPython3のバージョンがチェックされるので、事前に前回のPython3.13.5 が使えるように環境設定しておくのでしたね。

$ time make
.................................
The necessary bits to build these optional modules were not found:
_dbm
To find the necessary bits, look in configure.ac and config.log.

Checked 112 modules (33 built-in, 77 shared, 1 n/a on linux-aarch64, 0 disabled, 1 missing, 0 failed on import)
make[1]: Leaving directory '/home/espiya/src/Python-3.13.6'

real 51m13.802s
user 48m24.969s
sys 1m39.620s

$

# su
# make install


...............................
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 25.1.1
Uninstalling pip-25.1.1:
Successfully uninstalled pip-25.1.1
Successfully installed pip-25.2
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
#
# exit

今回も無事にインストールできました。

$ which python3 pip3
/usr/local/python/bin/python3
/usr/local/python/bin/pip3

$
$ python3
Python 3.13.6 (main, Aug 7 2025, 16:08:18) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()

$
$ pip3 --version
pip 25.1.1 from /home/espiya/.local/lib/python3.13/site-packages/pip (python 3.13)
$

今後ここでは、Python 3.13.6 を使う事にします。

Python はスケジュール通りアップデートされている言語で、この言語に入門してから気に入っているところです。自分で使用するPythonの環境を常に把握して、なるべく最新のPythonを使うようにすることを心がけたいものです。

goo blog も終了するそうで次回の Python のアップデートの頃にはどこかに引っ越す必要があるので、そろそろ引越作業に取りかかろうかと思っています。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Raspberry Pi に Python 3.13.5 をインストールする。

2025-07-06 18:19:20 | Python
最近、用があって Python から離れていました。久しぶりに次回のアップデート時期を確認しようとしたら、最新バージョンが 3.13.5 にアップデートされていました。

https://www.python.org/downloads/release/python-3135/
によると、6月11日に公開されたようで、緊急のバグフィックス?版みたいです。

ここから======
これは Python 3.13 の 5 回目のメンテナンスリリースです。

Python 3.13はプログラミング言語Pythonの最新のメジャーリリースで、Python 3.12と比較して多くの新機能と最適化が含まれています。3.13.5 は 3.13 の 5 回目のメンテナンスリリースです。

3.13.5 は 3.13.4 リリースのいくつかの重要な問題を修正するための簡易リリースです:

 gh-135151: Windows での拡張モジュールのビルドに失敗しました。
 gh-135171: ジェネレーター式が作成時にTypeError(反復可能でないオブジェクトに対する反復処理時)を発生させなくなり、最初の使用まで遅延するようになりました。
 gh-135326: intライクなオブジェクト(numpy.int64など)をrandom.getrandbits()に渡すと失敗しました。以前はうまくいっていた。

その他のバグ修正(次のリリースまで待たねばならないようなもの)も含まれています。

DeepL.com(無料版)で翻訳しました。
======ここまで


というわけで、ジェネレータ式に関するものが気になるので、Raspberry Pi の Python3 も 3.13.5 に置き換えます。ソースは以下の通りです。

https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz
https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz.asc
MD5 Sum: dbaa8833aa736eddbb18a6a6ae0c10fa

ダウンロードとチェックを行います。

$ wget https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz
--2025-07-05 14:09:12-- https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz
Resolving www.python.org (www.python.org)... 2a04:4e42:400::223, 2a04:4e42:600::223, 2a04:4e42::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42:400::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22856016 (22M) [application/octet-stream]
Saving to: ‘Python-3.13.5.tar.xz’

Python-3.13.5.tar.x 100%[===================>] 21.80M 39.2MB/s in 0.6s

2025-07-05 14:09:13 (39.2 MB/s) - ‘Python-3.13.5.tar.xz’ saved [22856016/22856016]

$

$ wget https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz.asc
--2025-07-05 14:11:02-- https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz.asc
Resolving www.python.org (www.python.org)... 2a04:4e42:600::223, 2a04:4e42::223, 2a04:4e42:200::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42:600::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 963 [application/octet-stream]
Saving to: ‘Python-3.13.5.tar.xz.asc’

Python-3.13.5.tar.x 100%[===================>] 963 --.-KB/s in 0s

2025-07-05 14:11:02 (15.8 MB/s) - ‘Python-3.13.5.tar.xz.asc’ saved [963/963]

$

$ gpg --verify Python-3.13.5.tar.xz.asc
gpg: assuming signed data in 'Python-3.13.5.tar.xz'
gpg: Signature made Wed 11 Jun 2025 18:45:54 BST
gpg: using RSA key 7169605F62C751356D054A26A821E680E5FA6305
gpg: Good signature from "Thomas Wouters <thomas@python.org>" [unknown]
gpg: aka "Thomas Wouters <thomas@xs4all.nl>" [unknown]
gpg: aka "Thomas Wouters <twouters@google.com>" [unknown]
gpg: aka "Thomas Wouters <thomas.wouters.prive@gmail.com>" [unknown]
gpg: aka "Thomas Wouters <thomaswout@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7169 605F 62C7 5135 6D05 4A26 A821 E680 E5FA 6305
$

$ md5sum Python-3.13.5.tar.xz; echo dbaa8833aa736e
ddbb18a6a6ae0c10fa
dbaa8833aa736eddbb18a6a6ae0c10fa Python-3.13.5.tar.xz
dbaa8833aa736eddbb18a6a6ae0c10fa
$

ビルドの前に、Python3 のための環境設定(PATH と LD_LIBRARY_PATH設定)をおこないます。
$ source ~/python3.sh
$ python3 --version
Python 3.13.4
$

さっそくインストールします。
$ tar xvf Python-3.13.5.tar.xz

$ cd Python-3.13.5

$ ./configure --prefix=/usr/local/python --with-readline --enable-shared --enable-optimizations
checking build system type... aarch64-unknown-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking for Python interpreter freezing... ./_bootstrap_python
checking for python3.13... python3.13
checking Python for regen version... Python 3.13.4
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking MACHDEP... "linux"
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking for --with-app-store-compliance... not patching for app store compliance
.........................................
configure: creating ./config.status
config.status: creating Makefile.pre
config.status: creating Misc/python.pc
config.status: creating Misc/python-embed.pc
config.status: creating Misc/python-config.sh
config.status: creating Modules/Setup.bootstrap
config.status: creating Modules/Setup.stdlib
config.status: creating Modules/ld_so_aix
config.status: creating pyconfig.h
configure: creating Modules/Setup.local
configure: creating Makefile
$

よく見ると、5行目の出力で今のPython3のバージョンをチェックしていますね。

$ time make
Running code to generate profile data (this can take a while):
# First, we need to create a clean build with profile generation
# enabled.
make profile-gen-stamp
...............................................
The necessary bits to build these optional modules were not found:
_dbm
To find the necessary bits, look in configure.ac and config.log.

Checked 112 modules (33 built-in, 77 shared, 1 n/a on linux-aarch64, 0 disabled, 1 missing, 0 failed on import)
make[1]: Leaving directory '/home/espiya/src/Python-3.13.5'

real 51m23.889s
user 48m38.787s
sys 1m36.611s

$

$ su
# make install

...............................................
Looking in links: /tmp/tmpfljb8xvi
Requirement already satisfied: pip in /usr/local/python/lib/python3.13/site-packages (25.1.1)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
# exit
$
$ which python3 pip3
/usr/local/python/bin/python3
/usr/local/python/bin/pip3
$ python3
Python 3.13.5 (main, Jul 5 2025, 15:17:14) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
$ pip3 -V
pip 25.1.1 from /home/espiya/.local/lib/python3.13/site-packages/pip (python 3.13)
$


無事にインストールできました。今後はこのバージョンの Python3 を利用します。

というわけで、次回の8月の定期アップデートはバージョンが一つずれて 3.13.6 になるようです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Raspberry Pi に Python 3.13.4 をインストールする。

2025-06-04 20:18:49 | Python
PEP 719
https://peps.python.org/pep-0719/

のスケ-ジュールどおり、2025-06-04 (日本時間)に、Python 3.13.4 がリリースされました。

https://www.python.org/downloads/release/python-3134/

(以下、Google Chrome で翻訳)
ここから======
Python 3.13.4
発売日: 2025年6月3日

これはPython 3.13の4回目のメンテナンスリリースです。
Python 3.13 は Python プログラミング言語の最新のメジャー リリースであり、Python 3.12 と比較して多くの新機能と最適化が含まれています。3.13.4 は最新のメンテナンス リリースであり、3.13.3 以降のいくつかの重要なセキュリティ修正、約 300 件のバグ修正、ビルドの改善、ドキュメントの変更が含まれています。
======ここまで


早速、Raspberry Pi にインストールしてみましょう。ソースは以下の通りです。
https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tar.xz
https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tar.xz.asc
MD5: 2e2a8eb2e1be50049dc4248d99a52f89 

例によって、ダウンロードして基本的なチェックを行います。

$ wget https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tar.xz
--2025-06-03 22:38:06-- https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tar.xz
Resolving www.python.org (www.python.org)... 2a04:4e42::223, 2a04:4e42:200::223, 2a04:4e42:400::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22672472 (22M) [application/octet-stream]
Saving to: ‘Python-3.13.4.tar.xz’

Python-3.13.4.tar.x 100%[===================>] 21.62M 39.3MB/s in 0.5s

2025-06-03 22:38:06 (39.3 MB/s) - ‘Python-3.13.4.tar.xz’ saved [22672472/22672472]

$

$ wget https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tar.xz.asc
--2025-06-03 22:39:12-- https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tar.xz.asc
Resolving www.python.org (www.python.org)... 2a04:4e42:200::223, 2a04:4e42:400::223, 2a04:4e42:600::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42:200::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 963 [application/octet-stream]
Saving to: ‘Python-3.13.4.tar.xz.asc’

Python-3.13.4.tar.x 100%[===================>] 963 --.-KB/s in 0s

2025-06-03 22:39:12 (20.1 MB/s) - ‘Python-3.13.4.tar.xz.asc’ saved [963/963]

$

$ gpg --verify Python-3.13.4.tar.xz.asc
gpg: assuming signed data in 'Python-3.13.4.tar.xz'
gpg: Signature made Tue 03 Jun 2025 18:32:44 BST
gpg: using RSA key 7169605F62C751356D054A26A821E680E5FA6305
gpg: Good signature from "Thomas Wouters <thomas@python.org>" [unknown]
gpg: aka "Thomas Wouters <thomas@xs4all.nl>" [unknown]
gpg: aka "Thomas Wouters <twouters@google.com>" [unknown]
gpg: aka "Thomas Wouters <thomas.wouters.prive@gmail.com>" [unknown]
gpg: aka "Thomas Wouters <thomaswout@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7169 605F 62C7 5135 6D05 4A26 A821 E680 E5FA 6305
$

$ md5sum Python-3.13.4.tar.xz; echo 2e2a8eb2e1be50049dc4248d99a52f89
2e2a8eb2e1be50049dc4248d99a52f89 Python-3.13.4.tar.xz
2e2a8eb2e1be50049dc4248d99a52f89
$

この Raspberry Pi では、インストールしたPython3を使用する環境として、python3.sh を用意してあります。

$ source python3.sh
$ python3 --version
Python 3.13.3
$
$ pip3 -V
pip 25.0.1 from /home/espiya/.local/lib/python3.13/site-packages/pip (python 3.13)
$

早速インストールしてみましょう。
$ tar xvf Python-3.13.4.tar.xz

$ cd Python3.13.4


configure のオプションは以前と同じです。

$ ./configure --prefix=/usr/local/python --with-readline --enable-shared --enable-optimizations
checking build system type... aarch64-unknown-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking for Python interpreter freezing... ./_bootstrap_python
checking for python3.13... python3.13
checking Python for regen version... Python 3.13.3
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking MACHDEP... "linux"
....................................
configure: creating ./config.status
config.status: creating Makefile.pre
config.status: creating Misc/python.pc
config.status: creating Misc/python-embed.pc
config.status: creating Misc/python-config.sh
config.status: creating Modules/Setup.bootstrap
config.status: creating Modules/Setup.stdlib
config.status: creating Modules/ld_so_aix
config.status: creating pyconfig.h
configure: creating Modules/Setup.local
configure: creating Makefile
$

$ time make
Running code to generate profile data (this can take a while):
# First, we need to create a clean build with profile generation
# enabled.
make profile-gen-stamp
........................................
The necessary bits to build these optional modules were not found:
_dbm
To find the necessary bits, look in configure.ac and config.log.

Checked 112 modules (33 built-in, 77 shared, 1 n/a on linux-aarch64, 0 disabled, 1 missing, 0 failed on import)
make[1]: Leaving directory '/home/espiya/src/Python-3.13.4'

real 51m8.102s
user 48m40.167s
sys 1m36.898s

$

$ su
# make install

..........................................
Processing /tmp/tmplsuopd3c/pip-25.1.1-py3-none-any.whl
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 25.0.1
Uninstalling pip-25.0.1:
Successfully uninstalled pip-25.0.1
Successfully installed pip-25.1.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
#

確認してみます。

$ which python3 pip3
/usr/local/python/bin/python3
/usr/local/python/bin/pip3
$
$ python3 --version
Python 3.13.4
$ python3
Python 3.13.4 (main, Jun 3 2025, 23:45:45) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
$
$ pip3 -V
pip 25.0.1 from /home/espiya/.local/lib/python3.13/site-packages/pip (python 3.13)
$


今回も無事にインストールできました。今後は、Python 3.13.4 を使用することにします。

何度も書きましたが、Raspberry Pi にソースからインストールするためには必要なライブラリ等を予めインストールしておく必要がありますが、一度こうした環境を整えることができればアップデートも容易なので、最新の安定版を使ってためすことができます。Pythonのように定期的にアップデートがある言語を習得しようとする人が、Raspberry Pi を利用するのは一利あると思います。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

入門者が、生成AIにPython3のプログラムを作成してもらい衝撃を受ける。 その2

2025-04-15 09:07:17 | Python
前回、
https://blog.goo.ne.jp/espiya/e/5fc44e8242c6f34b951ea3b2249a796b

Gemini によって非常に高速なプログラムを提示してもらったので、その中で気になった NumPy

https://numpy.org/

について確認してみました。この Raspberry Pi で使える NumPy は以下の通りです。

$ python3
Python 3.13.3 (main, Apr 9 2025, 01:53:38) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> print(np.version.version)
2.2.4
>>>

この中で、今回Geminiが提示したプログラムが利用しているのは、

「強力な多次元配列
NumPyの高速で多機能なベクトル化計算、インデックス処理、ブロードキャストの考え方は、現在の配列計算におけるデファクト・スタ>ンダードです。」


の機能ですね。2次元配列ですが、
puzzle[row,col]
のように記述出来るのは分かりやすくて、Python の入門者は、配列といったら NumPy を使う事を考える、と頭に入れておいた方が良さそうです。

今回は、あえて NumPy を使わずにプログラムを修正して、それがどれくらいプログラムの速度に影響しているかを調べてみました。このようにプログラムを修正して試すということが、入門者にとって色々な事が分かって役に立ちそうです。

さっそく NumPy を外してプログラムを修正してみます。

まず、NumPyを使わない Python3 では、2次元配列をどのように取り扱うかを調べます。

>>> a = [ [1,2,3], [4,5,6], [7,8,9] ]  # 一応2次元配列の定義
>>> a[1,2]   # NumPy のようには添字表記が使えない
Traceback (most recent call last):
  File "<python-input-2>", line 1, in <module>
    a[1,2]
    ~^^^^^
TypeError: list indices must be integers or slices, not tuple
>>> a[1][2]  # 他にもあるかもしれませんがこちらの表記で要素が取り出せる
6
>>>
>>> i = 5
>>> if i in a: # NumPy のように if ~ in ~: で要素の中に「5」が入っているか見つけられない
...       print('Yes')
...
>>>
>>> i = [4,5,6]
>>> if i in a: # つまり NumPy でないので、 リストの要素と一致している場合しか True にならない
...       print('Yes')
...
Yes
>>>

この結果から、Gemini が提示したプログラムを次のように修正しました。 煩雑なので puzzle を P にしてあります。

P = [
  [3, 0, 0, 7, 4, 0, 5, 2, 0],
  [0, 2, 8, 9, 0, 0, 0, 0, 0],
  [0, 4, 5, 0, 0, 0, 9, 0, 3],
  [4, 5, 0, 6, 0, 7, 0, 0, 9],
  [9, 0, 0, 0, 2, 3, 0, 0, 1],
  [0, 0, 0, 8, 5, 9, 3, 4, 7],
  [5, 0, 9, 0, 0, 2, 8, 0, 4],
  [1, 0, 0, 0, 0, 8, 0, 0, 0],
  [0, 0, 2, 3, 9, 4, 1, 0, 5]
]

def is_valid(P, row, col, num):
  # 行のチェック
  R = [ P[row][0],P[row][1],P[row][2],P[row][3],P[row][4],P[row][5],P[row][6],P[row][7],P[row][8] ]
  if num in R:
    return False

  # 列のチェック
  C = [ P[0][col],P[1][col],P[2][col],P[3][col],P[4][col],P[5][col],P[6][col],P[7][col],P[8][col] ]
  if num in C:
    return False

  # 3x3ブロックのチェック
  SR, SC = 3 * (row // 3), 3 * (col // 3)
  B = [ P[SR][SC],P[SR][SC+1],P[SR][SC+2],P[SR+1][SC],P[SR+1][SC+1],P[SR+1][SC+2],P[SR+2][SC],P[SR+2][SC+1],P[SR+2][SC+2] ]
  if num in B:
    return False

  return True

入門者なので 間違えないようにif文の前に一旦検査するリストを作成して変数に入れてあります。

def solve_sudoku(P):
  for row in range(9):
    for col in range(9):
      if P[row][col] == 0:
        for num in range(1, 10):
          if is_valid(P, row, col, num):
            P[row][col] = num
            if solve_sudoku(P):
              return True
            else:
              P[row][col] = 0
        return False
  return True

この部分は、配列の要素の表し方以外は変更がありませんね。

if solve_sudoku(P):
  for i in range(9):
    print(P[i])
else:
  print("解が見つかりませんでした。")

print(P)だと、行がずらずら並んで出力されるのでちょっと変更してみました。


以上で、NumPy を使わないプログラムが作成できました。早速実行してみます。
gemini 提示のプログラムを sudoku-g.py 、今回の修正を sudoku-g-mod.py としてそれぞれファイルを作成して実行してみました。

$ time python3 sudoku-g.py
[[3 9 1 7 4 6 5 2 8]
[7 2 8 9 3 5 4 1 6]
[6 4 5 2 8 1 9 7 3]
[4 5 3 6 1 7 2 8 9]
[9 8 7 4 2 3 6 5 1]
[2 1 6 8 5 9 3 4 7]
[5 6 9 1 7 2 8 3 4]
[1 3 4 5 6 8 7 9 2]
[8 7 2 3 9 4 1 6 5]]

real 0m0.449s
user 0m0.625s
sys 0m0.057s
$
$ time python3 sudoku-g-mod.py
[3, 9, 1, 7, 4, 6, 5, 2, 8]
[7, 2, 8, 9, 3, 5, 4, 1, 6]
[6, 4, 5, 2, 8, 1, 9, 7, 3]
[4, 5, 3, 6, 1, 7, 2, 8, 9]
[9, 8, 7, 4, 2, 3, 6, 5, 1]
[2, 1, 6, 8, 5, 9, 3, 4, 7]
[5, 6, 9, 1, 7, 2, 8, 3, 4]
[1, 3, 4, 5, 6, 8, 7, 9, 2]
[8, 7, 2, 3, 9, 4, 1, 6, 5]

real 0m0.098s
user 0m0.075s
sys 0m0.024s
$

NumPy を使わない方が速いという結果になりました。本来の多次元配列を使った計算を行っておらず、NumPy の利用がほんのさわりだけなのでこのような結果になったと思います。

やはりバックトラッキングアルゴリズムの solve_sudoku()が性能に物凄く影響していますね。

NumPy を使わない今回のプログラムを見ると、
Python がリストを基本としておりそのままでは多次元配列処理を扱いにくいため、たかだか2次元配列の処理でも複雑になりすぎているように見えます。
そのために NumPy が用意されて、しかも ndarray オブジェクトによって表記方法も分かりやすくなっています。
しかも、もともと配列演算に対して高速化も期待できるので NumPy が重要なのも納得です。入門者として、これから学んでいきたいですね。

今回の件で、数独に関して Gemini が提示したプログラムは solve_sudoku()のアルゴリズムが物凄く高速なので、少し性能が落ちても表記法が分かりやすい NumPy を使うべきであると感じました。

今後ますます生成AIが改良されていくでしょう。そのとき、プログラミング言語学習をどのように行うべきか、試行錯誤は続きそうです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

入門者が、生成AIに Python3 のプログラムを作成してもらい衝撃を受ける。

2025-04-13 22:02:22 | Python
生成AIも進展してプログラミングもできるようになったので、今までのように補助的な使用をしないで Python3 プログラムそのものを作成してもらいました。

今回は Google Gemini を利用して、数独のプログラム作成依頼でプロンプトはこのようになりました。

「python3で数独を解くプログラムを作成したい。動作するコンピュータが遅いのでなるべく高速になるように作成したい。問題はプログラムの入力ではなく、問題の1行を表す要素数9個のリストを9個使用する。以下に、問題の例を示す。  
# Set Puzzle
R1 = [3, 0, 0, 7, 4, 0, 5, 2, 0]
R2 = [0, 2, 8, 9, 0, 0, 0, 0, 0]
R3 = [0, 4, 5, 0, 0, 0, 9, 0, 3]
R4 = [4, 5, 0, 6, 0, 7, 0, 0, 9]
R5 = [9, 0, 0, 0, 2, 3, 0, 0, 1]
R6 = [0, 0, 0, 8, 5, 9, 3, 4, 7]
R7 = [5, 0, 9, 0, 0, 2, 8, 0, 4]
R8 = [1, 0, 0, 0, 0, 8, 0, 0, 0]
R9 = [0, 0, 2, 3, 9, 4, 1, 0, 5]


Gemini の回答は以下の通りです。

ここから======
数独ソルバーを高速化するために、いくつかの最適化手法を取り入れたPython3プログラムを提案します。

**1. 問題の表現**

与えられた問題を効率的に処理するために、NumPy配列を使用します。NumPyは、数値計算に特化したライブラリであり、高速な配列操作を提供します。

```python
import numpy as np

puzzle = np.array([
  [3, 0, 0, 7, 4, 0, 5, 2, 0],
  [0, 2, 8, 9, 0, 0, 0, 0, 0],
  [0, 4, 5, 0, 0, 0, 9, 0, 3],
  [4, 5, 0, 6, 0, 7, 0, 0, 9],
  [9, 0, 0, 0, 2, 3, 0, 0, 1],
  [0, 0, 0, 8, 5, 9, 3, 4, 7],
  [5, 0, 9, 0, 0, 2, 8, 0, 4],
  [1, 0, 0, 0, 0, 8, 0, 0, 0],
  [0, 0, 2, 3, 9, 4, 1, 0, 5]
])
```

**2. 制約条件のチェック**

各セルに数字を配置する際に、行、列、3x3ブロックの制約条件を満たしているかを効率的にチェックする関数を実装します。

```python
def is_valid(puzzle, row, col, num):
  # 行のチェック
  if num in puzzle[row]:
    return False

  # 列のチェック
  if num in puzzle[:, col]:
    return False

  # 3x3ブロックのチェック
  start_row, start_col = 3 * (row // 3), 3 * (col // 3)
  if num in puzzle[start_row:start_row + 3, start_col:start_col + 3]:
    return False

  return True
```

**3. 再帰的なバックトラッキング**

数独を解くために、再帰的なバックトラッキングアルゴリズムを使用します。

```python
def solve_sudoku(puzzle):
  for row in range(9):
    for col in range(9):
      if puzzle[row, col] == 0:
        for num in range(1, 10):
          if is_valid(puzzle, row, col, num):
            puzzle[row, col] = num
            if solve_sudoku(puzzle):
              return True
            else:
              puzzle[row, col] = 0
        return False
  return True
```

**4. 実行と結果の表示**

数独ソルバーを実行し、結果を表示します。

```python
if solve_sudoku(puzzle):
  print(puzzle)
else:
  print("解が見つかりませんでした。")

**高速化のポイント**

* **NumPyの活用:** NumPy配列を使用することで、高速な配列操作が可能になります。
* **制約条件の効率的なチェック:** 制約条件を効率的にチェックすることで、無駄な探索を減らします。
* **バックトラッキングの最適化:** バックトラッキングアルゴリズムを最適化することで、探索時間を短縮します。
(以下省略)
======ここまで


入門者にとって、かなり洗練されたプログラムが提示されました。

・ 配列を扱うために NumPy を使い、 array() で ndarray オブジェクトを生成する。
・ 条件判定に、 if num in ndarryaオブジェクトから抽出したもの を使う。
・ 再帰的呼び出し(バックトラッキングアルゴリズムと説明されている)で数値を埋めていく。

このプログラムは1つ解が見つかったら終了するので、以前作成したプログラムを解が見つかったら exit()で終了するようにして実際に実行してみました。

前のプログラム:
real 0m40.165s
user 0m40.147s
sys 0m0.017s


Geminiが提示したプログラム:
real 0m0.446s
user 0m0.637s
sys 0m0.042s


数独プログラムなので至るところで作成されて公開されているので生成AIが高速化されたプログラムを教えてくれると思いましたが、ここまで高速だったとは「衝撃的」です。

入門者は、すでに行ったように作成を少し助けてもらう事やdocstring などを生成してもらう場合に限定して生成AIを使ったほうが良さそうですね。
今回の場合のように全面的にプログラム作成に使ってしまった場合は、その動きを正しく理解する必要があると思いました。

というわけで、入門者として生成されたプログラムの説明を試みました。

まず、問題を2次元配列として考えるために NumPy を利用していますね。その、array()で生成されるndarrayオブジェクトにより、
・ 配列の行は、puzzle[row]  。
・ 配列の列は、puzzle[ : ,col]  。
・ 3行3列の部分配列の取り出しは、puzzle[row:row+3 , ocl:col+3 ] 。

で得られます。

これによって、is_valid()関数の判定で、
if num in puzzle[....]: が使えるようになり、行、列、3x3ブロックのなかに数値 num があるかどうかの判定ができるので分かりやすくなりますね。
ちなみに、3*(row//3) は切り捨て割り算なので、rowが 0~2 なら 0, 3~5 なら 3, 6-8 なら 6 となり数独のブロックに使えます。

入門者にとって難しいのは、「バックトラッキング」 solve_sudoku(puzzle) です。

まず、大切なのは Pytnon の関数の引数は「参照渡し」であることです。
そのため、puzzle のある要素 puzzle[row,col] の値が 0 の時、
puzzle[row,col] = num  のように値を代入したり、
その値代入が条件を満たさなかった場合に、
puzzle[row,col] = 0 のように値の代入をキャンセルしてもとの値 0 に戻すことができるわけですね。

外側のfor ループでrow(行) が 0から8まで、2番目のfor ループでcol(列) が 0から8まで繰り返して、
puzzle[row,col]の値が 0 でなければなにもしないで次に行き、
0 の場合は、
3番目のfor ループで num に 1から9まで値をpuzzle[row,col]に入れて、その時点で条件がクリア (is_valid()がTrue) できているときに、
puzzle[row,col]にnumを代入して、再帰的に solve_sudoku(puzzle) を呼び出すと、
今度は前に見つかった値が0の場所に仮の値が入っているので、次に値が0になるところまでrow、col を進めて、
同じ事を繰り返すわけです。

最後まで仮の値に矛盾がなければ True で帰って、穴埋め完了になり、矛盾が生まれたら値を 0 に戻して、次の num を試すのですね。

一見、外側の row ループや、2番目の col ループで繰り返すみたいに見えますが、
値をどんどん入れて行ったときに再帰的に呼び出した solve_sudoku() の中で、
すでに値が設定された要素をスキップして、次の値が0の要素を探すためのループと解釈できそうです。

0の所に値をどんどん入れて行って最後のsolve_sudoku() 呼び出しのとき値がすべて 0 でないので最後の行で True で帰るので、
次々に solve_sudoku()が True で帰って 9 行目の return Trueで終了するようです。
最後から2行目の return False は、解が無い場合の保険ですね。
設定する値は必ず 1~9 の中にある(Trueで帰る)前提でプログラムが作られているようです。

初心者なので、再帰的呼び出しが多くなりすぎるので動かないのではと思ってしまいそうなのと、このようなプログラムを作るとかなりの頻度でバグが発生しそうで、しかもバグが発生した場合に修正に困難が予想されるのでこのようなプログラムに辿り着ける可能性はほぼないような気がしました。

気になるのは、どうしてこのように高速になったのかです。
・ solve_sudoku() のアルゴリズム
・ NumPy の ndarray オブジェクトの使用
が考えられます。

そこで、次回 NumPy を使わない場合を試してみることにします。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Raspberry Pi に、Python 3.13.3 をインストールする。

2025-04-09 22:26:30 | Python
予定通り、2025-04-09(日本時間)に Python 3.13.3 がリリースされました。

https://www.python.org/downloads/release/python-3132/
(以下、Google Chromeで翻訳)
ここから======
Python 3.13.3
発売日: 2025年4月8日

これはPython 3.13の3回目のメンテナンスリリースです。
Python 3.13 は Python プログラミング言語の最新のメジャー リリースであり、Python 3.12 と比較して多くの新機能と最適化が含まれています。3.13.3 は最新のメンテナンス リリースであり、3.13.2 以降、約 320 件のバグ修正、ビルドの改善、ドキュメントの変更が含まれています。

======ここまで

ソースはこの中の以下のものです。(XZ圧縮版)
https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz
https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz.asc
MD5 8bb5f0b8c9d9d7b87d7d98510e8d58e5

$ wget https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz
--2025-04-09 00:42:30-- https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz
Resolving www.python.org (www.python.org)... 2a04:4e42:400::223, 2a04:4e42:600::223, 2a04:4e42::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42:400::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22654240 (22M) [application/octet-stream]
Saving to: ‘Python-3.13.3.tar.xz’

Python-3.13.3.tar.x 100%[===================>] 21.60M 39.4MB/s in 0.5s

2025-04-09 00:42:31 (39.4 MB/s) - ‘Python-3.13.3.tar.xz’ saved [22654240/22654240]

$

$ wget https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz.asc
--2025-04-09 00:44:27-- https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz.asc
Resolving www.python.org (www.python.org)... 2a04:4e42:600::223, 2a04:4e42::223, 2a04:4e42:200::223, ...
Connecting to www.python.org (www.python.org)|2a04:4e42:600::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 963 [application/octet-stream]
Saving to: ‘Python-3.13.3.tar.xz.asc’

Python-3.13.3.tar.x 100%[===================>] 963 --.-KB/s in 0s

2025-04-09 00:44:27 (23.3 MB/s) - ‘Python-3.13.3.tar.xz.asc’ saved [963/963]

$

$ gpg --verify Python-3.13.3.tar.xz.asc
gpg: assuming signed data in 'Python-3.13.3.tar.xz'
gpg: Signature made Tue 08 Apr 2025 18:09:21 BST
gpg: using RSA key 7169605F62C751356D054A26A821E680E5FA6305
gpg: Good signature from "Thomas Wouters <thomas@python.org>" [unknown]
gpg: aka "Thomas Wouters <thomas@xs4all.nl>" [unknown]
gpg: aka "Thomas Wouters <twouters@google.com>" [unknown]
gpg: aka "Thomas Wouters <thomas.wouters.prive@gmail.com>" [unknown]
gpg: aka "Thomas Wouters <thomaswout@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7169 605F 62C7 5135 6D05 4A26 A821 E680 E5FA 6305
$

$ md5sum Python-3.13.3.tar.xz; echo '8bb5f0b8c9d9d7b87d7d98510e8d58e5'
8bb5f0b8c9d9d7b87d7d98510e8d58e5 Python-3.13.3.tar.xz
8bb5f0b8c9d9d7b87d7d98510e8d58e5
$

ダウンロードしたファイルはこのように基本的な確認をすることをお勧めします。

Python3をインストールしている環境を設定します。ここでは、python3.sh でまとめてあります。
$ source python3.sh

早速、インストールしてみましょう。
$ tar xvf Python-3.13.3.tar.xz

$ cd Python-3.13.3

$ ./configure --prefix=/usr/local/python --with-readline --enable-shared --enable-optimizations
checking build system type... aarch64-unknown-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking for Python interpreter freezing... ./_bootstrap_python
checking for python3.13... python3.13
checking Python for regen version... Python 3.13.2
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking MACHDEP... "linux"
..................................................
configure: creating ./config.status
config.status: creating Makefile.pre
config.status: creating Misc/python.pc
config.status: creating Misc/python-embed.pc
config.status: creating Misc/python-config.sh
config.status: creating Modules/Setup.bootstrap
config.status: creating Modules/Setup.stdlib
config.status: creating Modules/ld_so_aix
config.status: creating pyconfig.h
configure: creating Modules/Setup.local
configure: creating Makefile
$

$ time make
Running code to generate profile data (this can take a while):
# First, we need to create a clean build with profile generation
# enabled.
make profile-gen-stamp
................................................................................
The necessary bits to build these optional modules were not found:
_dbm
To find the necessary bits, look in configure.ac and config.log.

Checked 112 modules (33 built-in, 77 shared, 1 n/a on linux-aarch64, 0 disabled, 1 missing, 0 failed on import)
make[1]: Leaving directory '/home/espiya/src/Python-3.13.3'

real 51m30.279s
user 49m11.255s
sys 1m35.573s

$

$ su
# make install
.................................................................................
Processing /tmp/tmp194d334c/pip-25.0.1-py3-none-any.whl
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 24.3.1
Uninstalling pip-24.3.1:
Successfully uninstalled pip-24.3.1
Successfully installed pip-25.0.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
#

pip も自動的にアップデートされました。

環境変数も設定済みですので、バージョンの確認を行います。

$ python3 --version
Python 3.13.3
$ python3
Python 3.13.3 (main, Apr 9 2025, 01:53:38) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
$


今回も無事にインストールできました。こちらのブログでは、今後 Python 3.13.3 を使います。

補足ですが、こちらの環境ではすでに3.13.2 とかインストール済みなので特に問題なくインストールできていますが、初めての場合でうまくできない場合は、

https://blog.goo.ne.jp/espiya/e/fdf200d42183170e14bd374987749a7d

などを参照して必要なライブラリ等を事前にインストールしておく必要があります。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

入門者が、Python プログラムの高速化に挑戦する。

2025-04-02 23:50:35 | Python
以前 Python3 で数独のプログラムを作りました。
https://blog.goo.ne.jp/espiya/e/31cfcafc2c57e4b98612fbe10b9266ad

しかし、Raspberry Piなので非常に実行時間がかかってしまいました。そこで、このプログラムを Cython に直して実行してみることにしました。
Python3 プログラムの中から、関数定義部分を取り出して Cython に変換すると思うのですが、ここで生成AIを利用することにします。

プロンプトは単純で、
「以下のPythonプログラムを高速化するために、Cythonプログラムに変換してください。
 (以下、import itertools と 関数定義をいれました。) 」

Google Gemini と Microsoft Copilot で試してみましたが、うまく行きませんでした。
詳しくは書きませんが、今回のプログラムのように関数の引数にリストを使うと変換されたCythonプログラムが何故かエラーになってしまうのです。

そこで プログラムの中で1から9までの数字が重複無く含まれているかを判定する関数に狙いをつけてPythonプログラムを修正することにしました。

つまり、

def check_list(b):
  """
  リストbの要素が重複なく1から9まで含まれているかを判定する関数
  Args:
    b: 判定対象のリスト
  Returns:
    bool: 条件を満たす場合はTrue、満たさない場合はFalse
"""

  # 要素数が9でない場合、Falseを返す
  if len(b) != 9:
    return False

  # 要素が1から9の範囲に含まれていないか、重複があるかを確認
  return set(b) == set(range(1, 10))

の関数を高速化すれば、プログラムが高速化できそうです。
やはり、set()が遅いのかもしれません。そこで、引数のリストの長さは9に固定なので判定は省略して、
VAL という「タプル」を用意(2のi乗にしてみました。0番目(値が入っていない状態)だけ0にしました。タプルを作るときに括弧で囲っていません。
これで、すべての要素を加えて 511 になるかどうかをチェックすることにしました。
ちょっと怪しいアルゴリズムのような気がしますが、可能性のある解はすべて出力するので、その中で正しいものを選べるので大丈夫です。

def check_list(b):
  VAL = 0, 1, 2, 4, 8, 16, 32, 64, 128, 256
  check_v = VAL[b[0]] + VAL[b[1]] + VAL[b[2]] + VAL[b[3]] + VAL[b[4]] + VAL[b[5]] + VAL[b[6]] + VAL[b[7]] + VAL[b[8]]

  # 要素が1から9の範囲に含まれていないか、重複があるかを確認
  return check_v == 511

プログラムの速度を比較してみます。が、以前の問題は遅いので、もう少し簡単な3分ぐらいで解ける問題を探してそれに変更しました。

$ time python3 sudoku.py
Question:
0 6 0 | 0 9 0 | 0 8 0
3 0 0 | 0 5 0 | 0 9 4
0 9 4 | 0 6 0 | 5 7 0
------+-------+-------
0 0 7 | 0 0 0 | 9 0 0
9 0 0 | 1 0 5 | 0 2 6
0 5 0 | 9 2 0 | 4 0 0
------+-------+-------
7 0 5 | 4 0 9 | 2 0 1
8 2 9 | 0 1 0 | 0 4 7
4 0 0 | 3 7 2 | 0 0 9

.......... 途中省略 ................

5 6 2 | 7 9 4 | 1 8 3
3 7 8 | 2 5 1 | 6 9 4
1 9 4 | 8 6 3 | 5 7 2
------+-------+-------
2 4 7 | 6 3 8 | 9 1 5
9 8 3 | 1 4 5 | 7 2 6
6 5 1 | 9 2 7 | 4 3 8
------+-------+-------
7 3 5 | 4 8 9 | 2 6 1
8 2 9 | 5 1 6 | 3 4 7
4 1 6 | 3 7 2 | 8 5 9
=== END ===

real 2m58.681s
user 2m58.445s
sys 0m0.128s

$ time python3 sudoku-mod.py
Question:
,,,,,,,,,, 途中省略 ,,,,,,,,,,,,,,,,,,,,,,,

------+-------+-------
7 3 5 | 4 8 9 | 2 6 1
8 2 9 | 5 1 6 | 3 4 7
4 1 6 | 3 7 2 | 8 5 9
=== END ===

real 1m12.566s
user 1m12.377s
sys 0m0.093s

大体、2倍ぐらい速くなっています。やはり、縦とブロックが条件を満たしているかの判定が高速化の鍵を握っていますね。
この例では答えも一つで、一応修正はうまくいきました。

Pythonプログラム入門の一環なので、タプルを使ってみることができて良かったです。

まもなく、Python 3.13 のアップデートがあるので、その話題にも触れたいと思います。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Raspberry Pi に、 Python 3.13.2 をインストールする。

2025-02-05 14:50:41 | Python
PEP 719 にあるように、

PEP 719 – Python 3.13 Release Schedule
https://peps.python.org/pep-0719/

2025-02-05(日本時間) に Python 3.13.2 がリリースされました。

https://www.python.org/downloads/release/python-3132/
(以下、Google Chromeで翻訳)
ここから======
Python 3.13.2
発売日: 2025年2月4日

これはPython 3.13の2回目のメンテナンスリリースです。
Python 3.13 は Python プログラミング言語の最新のメジャー リリースであり、Python 3.12 と比較して多くの新機能と最適化が含まれています。3.13.2 は最新のメンテナンス リリースであり、3.13.1 以降、約 250 件のバグ修正、ビルドの改善、ドキュメントの変更が含まれています。

======ここまで

ソースはこの中の以下のものです。

https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz

早速、Raspberry Pi にソースをダウンロードしてみます。

$ wget https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz
--2025-02-04 23:55:35-- https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz
Resolving www.python.org (www.python.org)... 2a04:4e42:8c::223, 146.75.112.223
Connecting to www.python.org (www.python.org)|2a04:4e42:8c::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22621108 (22M) [application/octet-stream]
Saving to: ‘Python-3.13.2.tar.xz’

Python-3.13.2.tar.x 100%[===================>] 21.57M 39.0MB/s in 0.6s

2025-02-04 23:55:35 (39.0 MB/s) - ‘Python-3.13.2.tar.xz’ saved [22621108/22621108]

$ wget https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz.asc
--2025-02-04 23:55:58-- https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz.asc
Resolving www.python.org (www.python.org)... 2a04:4e42:8c::223, 146.75.112.223
Connecting to www.python.org (www.python.org)|2a04:4e42:8c::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 963 [application/octet-stream]
Saving to: ‘Python-3.13.2.tar.xz.asc’

Python-3.13.2.tar.x 100%[===================>] 963 --.-KB/s in 0s

2025-02-04 23:55:58 (23.0 MB/s) - ‘Python-3.13.2.tar.xz.asc’ saved [963/963]

$

$ gpg --verify Python-3.13.2.tar.xz.asc
gpg: assuming signed data in 'Python-3.13.2.tar.xz'
gpg: Signature made Tue 04 Feb 2025 18:44:53 GMT
gpg: using RSA key 7169605F62C751356D054A26A821E680E5FA6305
gpg: Good signature from "Thomas Wouters <thomas@python.org>" [unknown]
gpg: aka "Thomas Wouters <thomas@xs4all.nl>" [unknown]
gpg: aka "Thomas Wouters <twouters@google.com>" [unknown]
gpg: aka "Thomas Wouters <thomas.wouters.prive@gmail.com>" [unknown]
gpg: aka "Thomas Wouters <thomaswout@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7169 605F 62C7 5135 6D05 4A26 A821 E680 E5FA 6305
$

スケジュール通りですね。早速インストールしてみましょう。3.13.1 の時と同じようにしてみます。

$ tar xvf ......../Python-3.13.2.tar.xz

$ cd Python-3.13.2
$
$ ./configure --prefix=/usr/local/python --with-readline --enable-shared --enable-optimizations

例によって、Raspberry Piでは時間がかかるので time コマンドで計測します。

$ time make
.............

The necessary bits to build these optional modules were not found:
_dbm
To find the necessary bits, look in configure.ac and config.log.

Checked 112 modules (33 built-in, 77 shared, 1 n/a on linux-aarch64, 0 disabled, 1 missing, 0 failed on import)
make[1]: Leaving directory '......................espiya/src/Python-3.13.2'

real 51m6.586s
user 48m55.436s
sys 1m31.861s
$


やはり、50分以上かかりますね。

$ su

# make install

Python3 を使うための環境変数設定は、ここでは python3.sh にしてあるので、

$ source python3.sh
$ which
/usr/local/python/bin/python3
$
$ python3
Python 3.13.2 (main, Feb 5 2025, 00:55:10) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>


今後は、 Python 3.13.2 を使う事にします。


さて、Python3で for 文とか入れると、
>>> for i in range(3):
... print(i)
...
0
1
2
>>>
のようになりますが、プロンプト >>> で、上矢印キーを押すと

>>> for i in range(3):
... print(i)
のようにいっぺんに出てくるのは、3.13 の特徴です。これは、readline や ncurses を使っていると思われます。

別のところで同様なインストールをしたとき、readline と ncurses でエラーがでてしまいました。
これは、readline と ncurses も事前にソースからインストールしておいて、Python 3.13 をビルドすると途中でエラーになるような現象でした。
そのときは make 時に、readline と ncurses のモジュールがないというメッセージがでていました。
記録していたわけではないのでうろ覚えですが、これにはまると中々抜け出せそうもないので、そんなときはおとなしくシステムのものを使う事をお勧めします。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Python 3.13.1 で、試しに Cython を使って見る。

2025-01-07 15:40:40 | Python
以前の記事、
https://blog.goo.ne.jp/espiya/e/cf058105a1d29877e483a3bd007b4039

では、インストールした Python 3.13 に Cython をインストールしておきました。Papsberry Pi は遅いので Cython の様な高速化は魅力的です。

Welcome to Cython's Developmentation
https://cython.readthedocs.io/en/stable/index.html

そこで、年末年始の隙間時間を利用して、前回インストールした Cython を使って見ます。
全く使ったことがないので、とりあえず次のものに出ていたプログラムを使います。

Faster code via static typing
https://cython.readthedocs.io/en/latest/src/quickstart/cythonize.html

このページでは、Pure Python と Cython の変更点がわかるようになっています。Pythonは変数の値の型が決まっていないので型変換に時間がかかるという考えから、Cython では型定義をするのが重要な変更点みたいです。

さて、この中の、integrate.py を Cython プログラムに変形したものが integrate_cy.pyx です。
関数の引数はそのまま型定義ができて、内部変数は cdef で定義するのですね。それ以外は変更していません。

$ cat integrate.py
def f(x):
   return x ** 2 - x

def integrate_f(a, b, N):
   s = 0
   dx = (b - a) / N
   for i in range(N):
     s += f(a + i * dx)
   return s * dx
$

$ cat integrate_cy.pyx
def f(double x):
   return x ** 2 - x

def integrate_f(double a, double b, int N):
   cdef int i
   cdef double s
   cdef double dx

   s = 0
   dx = (b - a) / N
   for i in range(N):
     s += f(a + i * dx)
   return s * dx
$


次にコンパイル?するために、setup.py を作ります。色々な所を参考にして適当に作りました。

$ cat setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize

ext = Extension("integrate", sources=["integrate_cy.pyx"], include_dirs=['.'])
setup(name="integrate", ext_modules=cythonize([ext]))

$

コンパイルします。
$ python3 setup.py build_ext --inplace
省略
$

これによって、

./build/
integrate.cpython-313-aarch64-linux-gnu.so
integrate_cy.c


が作成されました。ディレクトリ build の中身は以下の通りです。

$ ls -R build
build:
lib.linux-aarch64-cpython-313 temp.linux-aarch64-cpython-313

build/lib.linux-aarch64-cpython-313:
integrate.cpython-313-aarch64-linux-gnu.so

build/temp.linux-aarch64-cpython-313:
integrate_cy.o

$

Cython で作成されたライブラリ integrate を使って、以下のプログラム test001.py を動かすことができます。

$ cat test001.py
from integrate import f, integrate_f

if __name__ == "__main__":
   result = integrate_f(0.0, 2.0, 2000000)
   print(result)
$


比較用に、Pythonのプログラム test002.py も用意します。integrate.py の2つの関数を陽に定義しておきました。

$ cat test002.py
def f(x):
   return x ** 2 - x

def integrate_f(a, b, N):
   s = 0
   dx = (b - a) / N
   for i in range(N):
     s += f(a + i * dx)
   return s * dx

result = integrate_f(0.0, 2.0, 2000000)
print(result)
$

2つを実行して速度を比較します。

$ time python3 test001.py
0.6666656666670076

real 0m0.556s
user 0m0.543s
sys 0m0.012s

$ time python3 test002.py
0.6666656666670076

real 0m1.136s
user 0m1.128s
sys 0m0.009s
$


実際に2倍少し早くなっていますね。

今回とりあえず Cython を使ってみました。
必要な修正もあまりないので有用そうなので今後ももう少し調べてみたいと思います。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする