Linuxをインストールした環境だとPythonが使用できるようになっていますが、これは、Raspberry PIでも同じなので、メモリー搭載量が少ないRaspberry PI Zero2Wでも同様にPythonが使用できます。
MACだとIntel MACまではそのまま使用できていましたが、現在のRISCプロセッサの構成になってからはユーザーが追加する形で使用できるようになっています。
WINDOWS環境の場合、インストーラーでインストールできますが、Linux環境を構築する場合、
■ 仮想化(Hyper-VやVirtual Boxなど)
■ マルチブート
■ WSL2
を使用してLinuxを使用できるので、WIDOWSとLinuxを使用できるようになっています。その為、無印のWINDOWSでもWSL2は使用できるので、環境を構築すればLinux版のPythonを使用することも出来ます。
MACも仮想化環境は構築できるのですが、Linuxと同じような状態で動作するのでMACの場合だとPythonのインストールを行うとLinuxと同様の状態で使用できるようになっています。
デスクトップアプリを作る場合
Pythonをインストールすると、コードを書く時に使用する
■ 組み込み関数
■ 標準ライブラリ
が使用できるのですが、JAVAやC#など同様にGUIを使用したデスクトップアプリを作ることが出来ます。
この場合、
■ Tkinter
■ turtle
が使用できるので、それを使用してイベントハンドラや画像を使用することが出来るようになっていますが、このモジュールは 【 tkがないと動かない 】 ので、Tcl/tkで使用されているウィジェット環境のtkをインストールする必要があります。これをインストールしていない場合、ウィジェット環境を使用した処理が出来ません。
WINDOWS環境では、インストーラーでインストールを行う際に
■ Tcl/tkのインストール
■ IDLEのインストール
■ 環境変数の追加
のチェック項目が用意されています。この中のTcl/tkのインストールは
■ Tclというスクリプト言語
■ tkと言うウィジェット環境
になります。これをインストールすると先程の2つのモジュールを使用できるので、新規にウインドウを表示して動作するデスクトップアプリを作ることが出来るようになります。
IDLEは、統合開発環境で、
■ コーディング
■ デバッグ
を一つのアプリケーションで行えるようになっていますが、関数の書式の表示やtabキーで候補が表示されるなどの入力支援が使用できます。
また、【 F5キー 】 だけでコードの実行も行えるようになっています。
こうしたエディタをインストール段階で追加できるようになっていますが、LinuxとMAC環境では、tkと同様に別途インストールすることになります。
WINDOWS環境だとPowerShell SEがインストールされていると思うので、統合開発環境は用意されているので、インストーラーで 【 環境変数の設定をする 】 のチェックを入れておけばPowerShellだけでもコーディングとデバッグが行えるようになっているのでコードを書いてコードの実行をターミナルで行えるようになっていますが、別のインストーラーを追加することが出来るようになっています。
また、プログラミング言語のコンパイラの追加を行った場合、インストール後に環境変数を指定することになりますが、Pythonのインストーラーだとインストール段階でこの作業を行えるようになっています。
ターミナルやコマンドプロンプトでアプリケーションの実行をする際には
【 ソフト名 ファイル名.拡張子 】
で実行しますが、この際にPowershellの場合だと、
【 ./ソフト名 ファイル名.拡張子 】
で実行できます。ただし、これは環境変数が指定されている状態のものに限定されるので、それを行っていない場合だと、
【 ./相対パス/ソフト名 ファイル名.拡張子 】
のような物凄く長いコマンドを打ち込むことになります。PowerShellの場合だとSALコマンドを使用することでエイリアスの指定が出来るので、コーディングの前にパスを通しておけば略称で実行できるようになりますが、その都度SALを使うのも大変なので、通常は環境変数を指定することになります。
WINDOWS環境の場合、インストーラーでインストールしてスタートメニューに追加されているものの多くはダブルクリックだけで動作しますが、ターミナルやコマンドプロンプトを使用した場合だとコマンドを打ち込むことになるので、環境変数を追加する必要があります。
Linux環境だと、コードを書いてターミナルで実行できるので、
【 vim ファイル名.py 】
でvimを開いて、 【 i 】キーで入力モードにしてからコードを書き、【 esc 】キーで入力モードから出他あとに、【 :wq 】と入力すると記述したコードを保存してシェルに戻ることが出来ます。
そうすると、カレントディレクトリ(現在のディレクトリ)内部に作成したPythonファイルがあるので、この状態で、
【 python3 ファイル名.py 】
のように打ち込むとコードの実行が出来るようになっています。
Shegang(シバン)について
Pythonのコードを書く際には、Linux環境とMAC環境だと最初の行にShebangを書くことになりますが、この時に
【 #!usr/bin/env/ python3 】
のような記述を行うことになります。これは、
【 /usr/bin/env python3 ファイル名.py 】
で実行しているのと同じ状態になります。これは、LinuxとMACのみなので、WINDOWS環境だと必要ありません。
LinuxとMAC環境で共有する場合にはShebangが必要になりますが、WINDOWS環境だと実行の仕組みが異なるので全く異なる動作のさせ方が出来ます。
WINDOWS環境だとPython 3.3から 【 Pythonランチャー 】 が使用されているので、バージョン違いの環境でコードを実行する場合でも、Pythonランチャーが仮想的に判断して事項してくれるのでバージョン違いのコードを書いて実行しても動作するようになっています。
また、このランチャーが使用できるので、WINDOWS環境については3.3以降だと
【 ファイルをダブルクリックするだけで動作する 】
ので、LinuxやMACとは全く異なる実行方法を用いることが出来ます。
Linux環境だと、ランチャーに登録して実行するとWINDOWSのようにランチャーのダブルクリックだけで実行できるようになりますが、セキュリティーが少しユルくなってしまうので注意が必要です。
サーバのようにCUI環境だとマウス操作自体がなくコマンドラインだけなので全く関係ない話ですが、 【 デスクトップ環境だとLinuxでは相当前からランチャーで登録してダブルクリックで動作するような仕様になっている 】 ので、アプリケーションを作ってダブルクリックで実行したり、WINDOWS環境のように何も表示していないターミナルを開いてコードを実行することも出来るようになっています。
WINDWS環境の場合だと、これが 【 インストール直後から当たり前に出来る 】 ので、実行時オプションの指定などがない場合だとコードの実行にターミナルを使う必要がありません。
その為、WINDOWS環境では、
■ Pythonファイルのダブルクリック
■ コマンドライン
でのコード実行が出来るようになっています。
LinuxとMACの場合
VIsualStudioCodeなどのように
■ プロジェクトの作成
■ プロジェクトを作ったディレクトリ内で作業する
と言う作りだと、常にカレントディレクトリで作業をすることになりますが、VIMを使った場合には異なるので、シェルコマンドを使って作業をすることになります。
この場合、
■ pwd : カレントディレクトリのパスの表示
■ cd : ディレクトリの変更
■ mkdir : ディレクトリの制作
■ vim : エディタの利用
■ ls : ディレクトリ内の表示
などのコマンドを使用することになります。Linuxの場合だと、ホームsディレクトリがルートになっているはずなので、ここからどの階層にプロジェクトファイルを作るのかを考えていくことになります。
例えば、ホームディレクトリに 【 Python 】 のようなディレクトリを作る場合だと移動の必要がないので、ターミナル上で 【 mkdir Python 】 と入力すると
📁 ホームディレクトリ :
┃
┣ 📁 Python :
┣ 📁 ダウンロード :
┣ 📁 テンプレート :
┣ 📁 ドキュメント :
┣ 📁 ピクチャー :
┣ 📁 ビデオ :
┣ 📁 ミュージック :
のような形になります。この状態だと
▶ 📁 ホームディレクトリ :
┃
┣ 📁 Python :
┣ 📁 ダウンロード :
┣ 📁 テンプレート :
┣ 📁 ドキュメント :
┣ 📁 ピクチャー :
┣ 📁 ビデオ :
┣ 📁 ミュージック :
の位置がカレントディレクトリになりますが、作業用のディレクトリはPythonなので移動する必要があります。
この時に 【 cd 】 コマンドを使うことになります。対象のディレクトリはPythonなので、
【 cd Python 】
と入力するとプロンプトの表示が変わり、現在のカレントディレクトリがルートからPythonに変わります。その為、このコマンドを入力すると
📁 ホームディレクトリ :
┃
┣ ▶ 📁 Python :
┣ 📁 ダウンロード :
┣ 📁 テンプレート :
┣ 📁 ドキュメント :
┣ 📁 ピクチャー :
┣ 📁 ビデオ :
┣ 📁 ミュージック :
の場所がカレントディレクトリになります。ここでvimを使ってコードを書いた場合、📁 Pythonの中に新規のファイルが作成されるので、
【 vim test.py 】
のようにするとVIMが立ち上がりますが、ファイル名を指定するとカレントディレクトリにそのファイルが作成されるので、
📁 ホームディレクトリ :
┃
┣ ▶ 📁 Python :
┃ ┃
┃ ┗━📝text.py
┃
┣ 📁 ダウンロード :
┣ 📁 テンプレート :
┣ 📁 ドキュメント :
┣ 📁 ピクチャー :
┣ 📁 ビデオ :
┣ 📁 ミュージック :
が生成されます。その後、VIMを操作して
■ 【 i 】 キー : 入力モード
■ 【 : 】 キー : コマンドモード
■ 【 ESC 】 キー : モードから出る
を使用することになりますが、コマンドモードでは、
■ 【 w 】 キー : 上書き保存
■ 【 q 】 キー : WIMを出る
事ができます。この時に 【 :wq 】 と入力すると上書き保存をしてシェルに戻ることが出来るので、Pythonのコードを書いて上書き保存をしてターミナルに戻ることが出来ます。
と言っても、現在のターミナルは分割表示が出来るので、
■ VIM
■ ターミナル
で表示を多なって作業が可能で、
新しいタターミナルは現在作業中のディレクトリで開く
というオプションがあるので、これを有効にすると分割後のターミナルのディレクトリを作業中のディレクトリに指定することが出来ます。その為、上記の状態でVIMで作業をしている場合、 【 :q 】 を行ってシェルに戻らなくても分割表示にして新規にターミナルを開くだけで、現在の作業用のディレクトリに移動した状態でターミナルを立ち上げることが出来るようになっています。
先程の作業では既に
📁 ホームディレクトリ :
┃
┣ ▶ 📁 Python :
┃ ┃
┃ ┗━📝text.py
┃
の状態になっていますから、 【 ls 】 コマンドを使用して確認してみると、ディレクトリ内に 【 text.py 】 のファイルがあることが確認できると思います。
この時のカレントディレクトリのパスは 【 pwd 】コマンドで確認できますが、この時に表示されているパスが 【 PC内で使用できる絶対パス 】 になります。
この状態で、Pythonファイルを実行する場合には、シェルの状態で
【 python3 test.py 】
のように入力することになります。
サーバOSのようにCUIだけで動作させる場合には、ターミナルだけで作業するのと同じ状態になりますが、LinuxやMAC環境だとこの操作方法が基本になります。
別の統合開発環境を追加した場合には操作方法が変わってきますが、ターミナルだけだとこのような流れになります。
Anacondaと通常のPython
情報IのカリキュラムでPythonを使用する場合、Anacondaをインストールした環境を使う場合がありますが、この場合、 【 conda 】 でパッケージの追加を行います。
と言っても、Anacondaは 【 パッケージが揃っている 】 ので、学習で必要なmのを追加するということは少ないと思いますが、追加する際に使用するのは前述のようなcondaと言うコマンドになります。
通常のPythonをそのままインストールした場合だと、condaでのインストールではなく、 【 pip 】 を使用するので、Anacondaなどのようにcondaを使用したものとは異なります。
PCの処理能力がある程度高い場合だとAnacondaをインストールしておけば、色々なライブラリが最初から揃っているので便利ですが、パッケージ管理が通常のPythonとは事なrので注意が必要です。
Pythonとバージョンの違い
基本的にプログラミング言語にはサポート期間があるので、それを超えるとサポート対象外になりますから、オフラインの環境で使用することになります。
OSもそうですが、サポート対象外のものだとアップで戸が行われないのでセキュtリティーに問題が合ってもFIXされない状態で放置されることになります。
その為、サポート対象になっているバージョンを選択することになりますが、Pythonの場合、2.x系と3.x系では記述が異なるので互換性がありません。
また、PythonはCPythonでコンパイルが出来るのですが、この速度がバージョンアップごとに向上すると言う発表もあったので、なるべく新しいバージョンで安定したものを使用した方が処理速度を稼ぎやすくなっています。
Pythonに限らず、プログラミング言語はバージョンアップが行われると新しい機能が追加されますが、使いやすくなっていたり新しい機能が増えている場合が多いです。その為、バージョンアップをした場合には、変更点の確認をする必要があります。
過去と現在の違い
2003年辺りのコンシューマのPCは、
■ シングルコア
■ シングルスレッド
なので、スレッドを使用しても 【 並行処理になる 】 ような作りになっていました。これが、20年以上前のアーキテクチャになりますが、この時代のCPUはクロックの高いものでも3.2GHz位なので、現在のCPUの定格クロックくらいの物が最速と言う感じになっていました。その為、3GHz以上は高速と言う状態ですから、かなり遅いわけですが、シングルスレッド動作ですから、3DCGのレンダリングを行うと他のことができなくなると言う仕様になっていました。
その為、こうした環境でスレッドを使うと並列処理ではなく 【 並行処理 】 という 【 タスクの管理 】 になってしまいますが、現在のアーキテクチャだとこうした問題は発生せず、しっかりとスレッドを使ってくれる仕様になっています。
現在のマイコンでも2スレッドですから、シングルスレッドの製品というと100円マイコンなどのようなタイマーと処理を並列処理を行わないような用途のものになりそうですが、大昔だと上位のCPUですらそんな状態になっていました。
当然、20世紀はその状態でGHzを目剤sているような時代ですから、
【 Rapsberry PI ZERO2Wに勝てない物が多い 】
わけですが、1997年だと300MHzが高速な時代で2ソケットだとワークステーションと言う時代なので、既に、Raspberry PI ZERO2Wに遠く及ばない性能になっています。
CISCとRISCの違いがあるので、【 WINDOWS 2000辺りが入ると確実な速度差が生じる 】 わけですが、ウインドウマネージャーの影響を受けないサーバOSを走らせると確実な性能差がでてしまいます。
その為、古いアーキテクチャはかなり厳しいのですが、コーディングを行うサインの選択肢もかなり制約を受けてしまいます。
JAVAが登場した2年後の1997年辺りでもサーバソリューションやワークステーションではソケット数を増やして1つのPC内(もしくはブレード内)で複数のスレッドを扱えるようになっていたので、複数のスレッドを使うという選択肢は存在していたのですが、コンシューマの環境だと、Socket 478の最後の製品となるPrescottコアのPentium 4 x.xEGHzのシリーズがSMTを実装した最初の製品になります。
現在ではIntelとAMDの双方でSMTが使用できるようになっていますが、Hyper Threadingを実装したのはこのシリーズが最初です。
これにより、レンダリングを1スレッドで行い、バックグラウンドでテクスチャーを描くというような 【 レンダリング中に別のことを行う 】 ようなことが可能になりました。また、動画の書き出し中にテキストの作業を行うことも可能になったので、計算中は何もできなくなるということがなくなりました。
その後、ネイティブな2コア時代が登場し、LGA 775などの時代が始まりますが、この時代にIntelは
■ Pentium D
■ Pentium 4
をリリースし、32bit互換のx86-64をサポートして64bit対応で先行していたAMDは、64bit対応の2スレッドCPUのAthlon 64X2をリリースします。この時代から、スレッドやプロセスを使用できるようになりますが、その後のCore 2 QuadやPhenomeII X6のようなメニーコアプロセッサの登場によってプログラミング言語で使用できるプロセスとスレッドをコンシューマの環境でも自由に使えるようになります。
その後、AMDはさらなるコア数の増加を行ったAMD FXをリリースしますが、ベンチマークには体感の物がでなかったり、 【 紙面の情報が主流 】 の時代だと、AMD FXの記事を出しても雑誌が売れないという 【 情報社会の構造であまり良い状態になかった 】 こともあり、このプロセッサはあまり良い評価を受けていません。
消費電力のことを除くと 【 対抗場の製品よりもベンチマークが悪いけれど何故か冷えるプロセッサ 】 なので 【 クーラーを良くすれば結構使えそうなもの 】 だったのかもしれませんが、8スレッド対応のソフトウェアの登場はもっと後の話なので、 【 4コア競争になっていた 】 のも不幸な状況を招いたことの一つかもしれません。流石に現在だとワットパフォーマンスが悪すぎるので選択肢に入りませんが、ゲーム動作時に132W位消費するので、そうした点も低評価になった部分と言えます。
これ以降の時代から現在の物理コア自体が増える時代になっていきますが、Ryzenの登場で、物理コア+論理コア(SMT使用)でスレッド数が大幅に増え、キャッシュ容量の増加により処理能力が向上する時代になります。
この恩恵として、仮想化を行いやすくなったので、一つのマシンで複数のPCを動作させることが出来るようになったり、モバイル用のアプリを作る場合にエミュレーターや仮想化を使ったテストが出来るようになりました。
当然、スレッドが増えれば、その分だけ並列処理が行えるのでスレッドやプロセスを使った処理を行えるようになります。
Pythonにも
■ thiread
■ process
を使用するライブラリがあるので、アプリケーションが動作しているのと同じ状態と考えることが出来るプロセスと、その中に包含して動作するスレッドを使用できますが、Pythonの場合だと、CPUバウンドやI/Oバウンドが発生するので、
■ thiread : I/O周りの処理
■ process : CPU周りの処理
のようjに役割分担をして使用することになります。
これは、【 一つの処理をシングルスレッドで行うのではなく役割分担をして行うための技術 】 なので、基本となる処理の構造はシングルコア/シングルスレッドのものになりますから、通常のコーディングの方法を覚えた後の処理の高速化で使用するものになります。
現在はこうした処理を行う場合だと、
■ 物理コア数の多いCPUを使用する
■ メモリー搭載量を増やす
ことで、プロセスやスレッドで使用するメモリーの容量やコア数の振り分けが行いやすくなりますが、現在のコンシューマのPCのプロセッサでもそうした処理を試しやすく、構成の選択の自由度が高い状態になっています。
メモリー周りの話では、3/7にJADECが正式にグラフィックボード用のメモリーのGDDR7の規格策定が終了したというアナウンスがでていましたが、ASUSの
■ Intel 700/600マザーボード
■ AMD 600マザーボード
でDDR5対応製品のみですが、
【 BIOSのアップデートで最大メモリー搭載量が256GBになる 】
ようです。これは 【 DDR5 64GB x4枚 】 での話になりますが、2枚構成でも 【 DDR5 64GB x2 】 の128GBの実装が可能になるようです。
最近は短期間で規格が入れ替わっているのですが、PCI Expressやメモリー周りにも変化があり、今後はDDR4がノンサポートのマザーボードが登場することになるので、自作の組み換えをする時に既存のDDR4メモリーを流用することができなくなります。
メモリーの容量が増えるとWSL2やHyper-Vなどの仮想化を使った環境でも出来ることが増えそうですが、作業時のメモリー消費量が少ない場合、DDR5はECCによるパリティーチェックも行われているので、用途が限定されそうですがRAMディスクとして容量を割り当てておいて一時ファイルの記録場所にしておくとSSDの書き込み容量を抑えることが出来ます。
ワークステーションのCPUは別次元にスレッドが多いので、コンシューマのスレッド数が物凄く少なく見えてしまうわけですが、昨年発表されたRyzen Threadripper Pro 7995W は 【 96コア/192スレッド 】 と言う200スレッドに迫るようなものになっていますし、メモリー搭載量の上限も2TB(256GBx8)となっているので、全く次元が異なるものになっています。そして、PCI Expressのレーン数もコンシューマの製品とは桁違いに多いです。また、この製品L3キャッシュは384MBですから、1997年の上位CPUであるPentium II構成の最大メモリー搭載量を1.5倍超の容量が実装されています。
ただし、こうしたワークステーションやサーバで使う環境の製品は
【 壊れたのかと思うほど起動にかかる時間が長い 】
ので、近年のコンシューマの環境でなれている人だと不安になるレベルの立ち上がりの遅さになっています。そもそも、サーバに至っては 【 シャットダウンという概念がない 】 ので動作した状態を維持するものになっていますから一度立ち上げたらそのままで使用することになりますが、前述のRyzen Threadripper Pro 7995WのプロセッサのTDPは350Wですから、かなり消費電力の高い構成になっています。
現在のコンシューマの製品でも192スレッドもあると上位製品6台分くらいのスレッド数になるので、別次元の仕様になっています。
現在のプロセッサだと、ローエンドでも4コアで、Core i3やRyzen 3でも4コア/8スレッドですから、スレッドを使った処理や仮想化が行いやすい状態になっているので、大昔のシングルスレッド/シングルコアの時代とは出来ることが異なり、でいることも増えています。
スレッドの違い
C++やJAVAでもスレッドは使用できますが、こうしたプログラミング言語で使用しているスレッドとPythonやRUBYで使用しているスレッドでは処理自体が異なります。
一般的なプログラミング言語では 【 スレッドセーフ 】 なので、こうしたプログラミング言語でスレッドを使用するとプロセッサのスレッド数やコア数分だけスレッドを増加させることが出来ます。
これが、一般的に言われるスレッドの処理になります。こうした処理の内容を見ると、 【 プロセスで処理をするよりもスレッドを使うようにしましょう 】 というのも至極当然な内容と言えます。
PythonやRUBYの処理は、スレッドセーフではなく、GIL (Global Interpreter Lock)なので同時に実行できるスレッドは1つになっているので、スレッドを使用してもプロセッサ側の処理は平行処理になってしまいます。その為、スレッドを使っても演算処理は高速化されることはありません。ただし、I/Oバウンドは少ないので、データの読み書きのような処理だとスレッドを使うと高速化出来ます。
プロセスは
【 実行しているアプリケーションが複数立ち上がっている状態 】
ですから、この場合、コア数をそのまま割り当ててソフトで同時処理をしているような状態ですから、Pythonデコードを書いてもプロセスで使用しているコア数分だけ速度を上げることが出来ます。
プログラミング言語だと
■ JavaScript
■ RUBY
■ Python
はGILで動作しているので、プロセスで動かさないとダメな物も存在します。
プログラミング言語を新規に学習する場合だと、スレッドやプロセスの制御は応用分野なので、処理を作るためのコードの書き方を学習したり、
■ データ
■ UI
■ 処理
の部分をどのようにすれば良いのか、また、それを行うために必要な物を覚えたり、記述の仕方などを学習することになります。
その為、入門書を開いてコードを書いている状態だとシングルスレッド動作のコード担っているはずなので、通常は1つのプロセス内の1つのスレッドのみを使っていることになります。