実現したいこと
pythonで書いていたプログラムの計算を高速化したいと考え、c言語を学習中です。cでの書き直し自体はできたのですが、完成したコードがpythonより遅いという結果になりました。
原因を調べたところ、2次元配列に対してforループを回すと遅くなることが分かりました。下記のcのコードを高速化するにはどうしたら良いでしょうか?よろしくお願い致します。
実験結果の詳細
実験には下記に記載したコードを使用しました。
プログラムの内容は、すべての要素が1の1000*1000の2次元配列を用意した後、各要素に0.5を加える操作を10000回forループで実行しています。
Pythonで実行した場合は約5.5秒でしたが、Cで実行した場合約22.0秒とPythonより計算時間が長くなりました。下記コードの中で「各要素に0.5を加える操作を10000回実施」部分を行わない場合はCの方が2倍程度速かったため、遅くなる原因は2次元配列に対してfor文を回すところにあると考えています。
C
1#include <stdio.h> 2#include <time.h> 3 4#define n 1000 5#define tmax 10000 6int x, y, t; 7double start,end; 8double u1[n][n]; 9 10int main(void) { 11 start = clock(); 12 13 //初期値の設定 14 for(x=0;x<n;x++){ 15 for(y=0;y<n;y++){ 16 u1[x][y] = 1; 17 } 18 } 19 20 //各要素に0.5を加える操作を10000回実施 21 for(x=0;t<tmax;t++){ 22 for(x=0;x<n;x++){ 23 for(y=0;y<n;y++){ 24 u1[x][y] += 0.5; 25 } 26 } 27 } 28 printf("%lf\n", u1[0][0]); 29 end = clock(); 30 printf("finish time : %lf s\n", (double)(end-start)/ CLOCKS_PER_SEC); 31 return 0; 32} 33
Python
1import numpy as np 2import time 3 4start_time = time.perf_counter() 5//初期値の設定 6u1 = np.full((1000, 1000), 1, dtype="float64") 7 8//各要素に0.5を加える操作を10000回実施 9for i in range(10000): 10 u1 += 0.5 11 12print(u1[0,0]) 13end_time = time.perf_counter() 14elapsed_time = end_time - start_time 15print(elapsed_time)
実行環境
・cはgccでオプションなしでコンパイル後、vscodeで実行しました。
・pythonはjupyter notebook上で実行しました。
以上になります。どうぞよろしくお願い致します。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/11 06:09
2022/03/11 07:18