ここでのソリューションのいくつかは、さまざまな「偶数」操作、具体的にはn % 2
vsn & 1
にかかる時間を参照していますが、これが のサイズによってどのように変化するかを体系的にチェックすることはなくn
、速度を予測することがわかります。
簡単に言えば、適切なサイズの数値 (通常は < 1e9 ) を使用している場合、大きな違いはありません。より大きな数値を使用している場合は、おそらくビット単位の演算子を使用する必要があります。
これは、何が起こっているかを示すプロットです (Linux 5.1.2 で Python 3.7.3 を使用):
基本的に、「任意精度」の長さに達すると、モジュラスの処理が徐々に遅くなりますが、ビット単位の操作は一定のままです。また、これの乗数に注意してください10**-7
。つまり、1 秒あたり約 3,000 万 (小さな整数) チェックを実行できます。
Python 2.7.16 の同じプロットを次に示します。
これは、新しいバージョンの Python に導入された最適化を示しています。
私のマシンにはこれらのバージョンの Python しかありませんが、興味のある他のバージョンの Python を再実行することができます。n
1 と 1e100 の間に 51 の s があります(対数スケールで等間隔)。
timeit('n % 2', f'n={n}', number=niter)
ここで、約 0.1 秒かかるようniter
に計算されtimeit
、これが 5 回繰り返されます。の扱いが少し厄介なのn
は、ローカル変数よりも遅いグローバル変数ルックアップのベンチマークも行わないようにすることです。これらの値の平均が線の描画に使用され、個々の値がポイントとして描画されます。