LoginSignup
7
1

More than 1 year has passed since last update.

言語 vs Python の速度対決 (ができてない)

Last updated at Posted at 2021-07-11

ふと気になったので初心者がC言語とPythonの速度対決をしたいと思います。
追記: 注意:後でいいますが、これでは速度対決になっていません。

どのようなコードか

a.py
import time

s = time.time()
a = 0
for i in range(0,9):
    for i in range(0,999999):
        a += 1
print("Python:",time.time()-s,"\nループ数:",a)

a.cpp
#include <stdio.h>
#include <time.h>

int main(void) {

    clock_t start_clock, end_clock;
    start_clock = clock();
    int a = 0;
    for (int i=0;i < 9;i++){
      for (int i=0;i < 999999;i++){
        a++;
      }
    }
    end_clock = clock();
    printf(
        "C言語: %f\nループ数: %d", 
        (double)(end_clock - start_clock) / CLOCKS_PER_SEC, a
    );

    return 0;
}

結果

Python: 1.204263687133789
ループ数: 8999991

C言語: 0.022000
ループ数: 8999991

意外と差がありました。
やっぱりC言語の方がはやいようです。

という無知がやった実験でした

追記

記事を投稿した後、コメントのにて様々な指摘がありましたので、そのまま記事にのせたいと思います。
まず、今まで分からなかったのですが、C言語の場合で速度を評価する場合、最適化オプションをつけてコンパイルするのが普通らしいです。
自分の環境で試したところ、最適化オプションをつけたところ、本当に一瞬で終わるようになりました。
ということで、まずこのコードで比較ができないわけです。
さらにコメントで

python の整数は多倍長ですが、C++ の整数は固定長です。なので、単なる加算を比較すること自体が公平じゃないかもしれません。

というご指摘をいただきました。そのような違いがあったということは知らなかったです。

また、この記事の一番最初では大量のたし算の速さを比べるものであります。
(999999+999999という計算を何回も繰り返すというやつです。気になる場合は編集履歴を確認してみてください。)
「999999+999999」はコンパイルする時点でその答えに置き換わるようです。
訂正:コンパイルする時点でその答えに置き換わるというよりかは、その計算の答えが使われないため、
何もなかったかのように除去されるということでした。
それはPythonでも同様だということでした。

とても勉強になりました。

さらに追記

さきほどこんな感じに書いたと思います。

自分の環境で試したところ、最適化オプションをつけたところ、本当に一瞬で終わるようになりました。
ということで、まずこのコードで比較ができないわけです。

コメントでアドバイスをもらいました。変数 a の宣言にvolatileを付けたり、ループ中に変数 a への最適化を阻害するインラインアセンブラを書いたりすればできるようでした。

volatile int a = 0;
__asm __volatile("":"+r"(a));

たしかに、これなら最適化オプションを付けても一瞬で終わる っていうことがなくなりました。
gcc -O2 a.c
ちなみにタイムはこんな感じです。

C言語: 0.017000

環境

Windows 10 Pro
64 bit
Python 3.9.5
gcc 6.3.0

7
1
17

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1