Python の算術演算子、論理演算子、ビット演算子、シフト演算子、代入演算子について学んできたが、算数で乗除算が加減算に優先するように、これらの演算子が1つの式の中に含まれるときには演算(式の評価)の優先順位がある。今回は演算の優先順位を学ぶが、演算子が多すぎて覚えきれないかもしれない。でも大丈夫――算数と同じで括弧 (...) を付けることで優先順位をコントロールできるので。
サンプル・プログラム
演算の優先順位
Python の式の評価は、算数で習ったように、乗除算は加減算より優先して実行される。 \( 1+2 \times 3 \)の解は9ではなく7だ。
これまで紹介してきた演算の優先順位は、算数・数学で習ったものに準ずる。ここで、優先順位を一覧にしておこう。
これまで紹介してきた演算の優先順位は、算数・数学で習ったものに準ずる。ここで、優先順位を一覧にしておこう。
順位 | 演算子 |
---|---|
1 | (...), [...], {...} |
2 | x[i], x[i:i], x(args...), x.arrt |
3 | await |
4 | ** |
5 | +x, -x(符合), ~x |
6 | *, @, /, //, % |
7 | +, - |
8 | <<, >> |
9 | & |
10 | ^ |
11 | | |
12 | in, not in, is, is not, <, <=, >, >=, !=, == |
13 | not |
14 | and |
15 | or |
16 | if...else |
17 | lambda |
18 | := |
演算子の種類が多くて覚えきれないかもしれない。また、プログラムを作ったあなたは覚えていても、そのプログラムを読む方が大保得ていないかもしれない。そんなときは、丸括弧 (...) で囲って明示した方がいい。
Python では、行末までを1つの式として評価する。途中で改行すると、式は途切れてしまう。インデントを置いてもだめだ。
Python では、行末までを1つの式として評価する。途中で改行すると、式は途切れてしまう。インデントを置いてもだめだ。
a = 2 + 3
* 4
print(a)
結合則
優先順位が同じ演算子が並んでいるときは、原則として、左から右へ評価する。これを結合則と呼ぶ。
たとえば \( 1 - 2 + 3 \) は \( (1 - 2) + 3 \) と同じで、式の計算結果は \( 2 \) になる。
結合則には例外があり、べき乗と代入は、右から左へ評価する。
\( 2 \ *\!\!* \ 2 *\!\!* \ 3 \) は \( 2 \ *\!\!* \ (2 *\!\!* \ 3) \) と同じで、式の計算結果は \( 64 \) ではなく \( 256 \) になる。
たとえば \( 1 - 2 + 3 \) は \( (1 - 2) + 3 \) と同じで、式の計算結果は \( 2 \) になる。
結合則には例外があり、べき乗と代入は、右から左へ評価する。
\( 2 \ *\!\!* \ 2 *\!\!* \ 3 \) は \( 2 \ *\!\!* \ (2 *\!\!* \ 3) \) と同じで、式の計算結果は \( 64 \) ではなく \( 256 \) になる。
練習問題
次回予告
これまで、コンピュータは2進数で計算するために小数演算で循環小数になる場合について触れたが、これを回避する方法はないのだろうか。また、Pythonの計算は、電卓のように10進数8桁や12桁といった限界はないのだろうか。次回は、数値型の範囲と誤差について学ぶことにする。
コラム:スーパーコンピュータとPython
1977年(昭和52年)4月、世界で初めて個人向けに完成品コンピュータとして大量生産・大量販売されたマイクロコンピュータ「Apple II」が発表される。搭載しているCPUは MOS 6502 で、算術演算は加減算のみだった。
一方、1964年(昭和39年)に販売が始まったIBMの大型汎用コンピュータ(メインフレーム) System/360 は、上位機種では浮動小数の四則演算を実行するハードウェアを搭載していた。
一方、1964年(昭和39年)に販売が始まったIBMの大型汎用コンピュータ(メインフレーム) System/360 は、上位機種では浮動小数の四則演算を実行するハードウェアを搭載していた。
ところが、「コラム:加算と乗算とシフト演算」で触れたように、算術演算には時間がかかる。当時のメインフレームは、いまのパソコンと違って、メモリの応答速度よりCPUの処理速度の方が遅かった。
そこで、アメリカのコンピュータ技術者シーモア・クレイは、CPUの処理速度向上だけを目指し、1976年(昭和51年)にスーパーコンピュータ「Cray-1」を発売する。演算性能は約160MFLOPSに達した(1MFLOPSは、1秒間に浮動小数点演算を100万回行うことができる)。
そこで、アメリカのコンピュータ技術者シーモア・クレイは、CPUの処理速度向上だけを目指し、1976年(昭和51年)にスーパーコンピュータ「Cray-1」を発売する。演算性能は約160MFLOPSに達した(1MFLOPSは、1秒間に浮動小数点演算を100万回行うことができる)。
それまでのCPUは、算術演算を行う演算器(アキュムレータ)が1つしかなく、同時に1つの算術演算子かできなかった。これをスカラー計算機と呼ぶ。
Cray-1 は、同時に複数の算術演算を行うことができる。これをベクトル計算機と呼ぶ。回路が複雑になるのを避けるため、たとえば128ビットの浮動小数点演算を行うことができる演算器を用意しておき、32ビットの浮動小数点演算を4つ同時に行う SIMD命令を実装している。この仕組みは、現在のCPUやGPUにも踏襲されている。
Cray-1 は、同時に複数の算術演算を行うことができる。これをベクトル計算機と呼ぶ。回路が複雑になるのを避けるため、たとえば128ビットの浮動小数点演算を行うことができる演算器を用意しておき、32ビットの浮動小数点演算を4つ同時に行う SIMD命令を実装している。この仕組みは、現在のCPUやGPUにも踏襲されている。
Cray-1 発売の翌年1977年(昭和52年)、富士通はベクトル計算機 FACOM 230-75 APU完成させる。政府の支援もあり、国産ベクトル計算機は急速に性能を向上させ、1982年(昭和57年)から1983年にかけ、日本初のスーパーコンピュータである富士通「FACOM VP-100」、日立製作所「HITAC S-810」、NEC「SX-1/SX-2」を誕生させた。SX-2は、演算速度がGFLOPS(1秒間に浮動小数点演算を10億回)を超えた。
今日のスーパーコンピュータでは、より複雑な方程式を同時処理するノードを多数接続できるインターコネクトの設計が、その演算性能を左右する。
2012年(平成24年)6月に完成した国産スーパーコンピュータ「京」は Tofuインターコネクトという独創的なメカニズムで88,192ノードを接続し、10PFLOPS(1秒間に浮動小数点演算を1京回)を実現し、ブッチギリで世界1位の性能を達成した。
2012年(平成24年)6月に完成した国産スーパーコンピュータ「京」は Tofuインターコネクトという独創的なメカニズムで88,192ノードを接続し、10PFLOPS(1秒間に浮動小数点演算を1京回)を実現し、ブッチギリで世界1位の性能を達成した。
Tofuインターコネクトは、2021年(令和3年)に本格稼働した後継機の「富岳」に受け継がれた。400PFLOPSという演算性能もさることながら、誰でも利用できるスーパーコンピュータを目指し、なんと Pythonでプログラムを組むことができるようになっている。
(この項おわり)