質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

298閲覧

ターミナルで実行するのに時間がかかりすぎる

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/06/23 10:14

ターミナルで実行するのに時間がかかりすぎます。

画像圧縮のアルゴリズムを書いています。

N × N ピクセルのグレースケール画像があり各ピクセルの画素値は 0 から 255 までの整数で指定されています。
この画像を縦横それぞれ K 分の 1 (K は N の約数) の大きさに縮小することが目標で、

元の画像を K × K ピクセルのブロックに区切る。その結果、N/K × N/K 個のブロックができる。(図左)
各ブロックに対して、ブロックに含まれるピクセルの画素値の平均値 (小数点以下切り捨て) を計算する。(図中央)
各ブロックを新しい一つのピクセルと見なし、N/K × N/K ピクセルの画像を作る。
ここで、新しいピクセルの画素値は 2. で計算した平均値とする
という条件があります。

# coding: utf-8 a_str = [6,2] num_array =[76,251,15,224,89,129,90,129,102,161,14,92,78,180,218,236,47,25,96,126,138,37,59,202,43,213,30,105,29,195,132,19,14,166,106,16] for i in range(a_str[0]): second_lines = input() t = second_lines.rstrip().split() b_str = list(map(int,t)) num_array.extend(b_str) for_num =[] for i in range(a_str[0]*2): for_num.append(i*3) x=0 three_num =[] for j in range(a_str[0]*2): k = j*a_str[1] l = k+a_str[1] three_num.append(num_array[k:l]) sum_num=[] for i in range(a_str[0]*2): x =three_num[i] y = sum(x) sum_num.append(y) sum_num2=[] sum_num3=[] deci = int(a_str[0]/a_str[1]) for j in range(a_str[0]*2): if j % 2 == 0: sum_num2.append(sum_num[j]) else: sum_num3.append(sum_num[j]) ans_sum_num2=[] ans_sum_num3=[] stotal = 0 # 小計 rcount = 0 # ループカウンタ for v in sum_num2: stotal += v # 小計に加算 rcount += 1 # カウントをすすめる if rcount % 3 == 0: # 3回ごとに実行 ans_sum_num2.append(stotal) # 合計を取得 stotal = 0 # 小計をリセット for v in sum_num3: stotal += v # 小計に加算 rcount += 1 # カウントをすすめる if rcount % 3 == 0: # 3回ごとに実行 ans_sum_num3.append(stotal) # 合計を取得 stotal = 0 # 小計をリセット ans1=[] for i in range(len(ans_sum_num2)): ans1.append(int(ans_sum_num2[i]/(a_str[1]*a_str[1]))) ans2=[] for i in range(len(ans_sum_num3)): ans2.append(int(ans_sum_num3[i]/(a_str[1]*a_str[1]))) print(" ".join(map(str, ans1))) print(" ".join(map(str, ans2)))

とコードを書いて実行したところ、今実行して1時間ぐらい経つのですが、それでも全く動かないです。何がそんなにこのアルゴリズムは重くなってしまったのでしょうか?for文を沢山使っているところが間違っているのでしょうか?(しかし、同じ内容をfor文を使わないで書く書き方がわからず...)どう直せば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matobaa

2017/06/23 11:01

input() にどんな入力を食わせていますか?
guest

回答1

0

コメントにmatobaさんが書かれているように、input()待ちで止まっているようです。
入力待ちの時に何かキーを押したり、そのままエンターを押すと残りの処理が進みました。

a_str = [6,2]に対してrange(a_str[0])していますので、
実際にはrange(6)の回数分だけinput()待ちが起きていると思います。

Python

1# coding: utf-8 2a_str = [6,2] 3 4num_array =[76,251,15,224,89,129,90,129,102,161,14,92,78,180,218,236,47,25,96,126,138,37,59,202,43,213,30,105,29,195,132,19,14,166,106,16] 5 6for i in range(a_str[0]): 7 print("before") #<----追加 8 second_lines = input() 9 print("after") #<----追加 10 t = second_lines.rstrip().split() 11 b_str = list(map(int,t)) 12 num_array.extend(b_str) 13 14for_num =[] 15for i in range(a_str[0]*2): 16 for_num.append(i*3) 17 18x=0 19 20three_num =[] 21for j in range(a_str[0]*2): 22 k = j*a_str[1] 23 l = k+a_str[1] 24 three_num.append(num_array[k:l]) 25 26sum_num=[] 27 28for i in range(a_str[0]*2): 29 x =three_num[i] 30 y = sum(x) 31 sum_num.append(y) 32 33sum_num2=[] 34sum_num3=[] 35deci = int(a_str[0]/a_str[1]) 36 37for j in range(a_str[0]*2): 38 if j % 2 == 0: 39 sum_num2.append(sum_num[j]) 40 else: 41 sum_num3.append(sum_num[j]) 42 43ans_sum_num2=[] 44ans_sum_num3=[] 45stotal = 0 # 小計 46rcount = 0 # ループカウンタ 47for v in sum_num2: 48 stotal += v # 小計に加算 49 rcount += 1 # カウントをすすめる 50 if rcount % 3 == 0: # 3回ごとに実行 51 ans_sum_num2.append(stotal) # 合計を取得 52 stotal = 0 # 小計をリセット 53 54for v in sum_num3: 55 stotal += v # 小計に加算 56 rcount += 1 # カウントをすすめる 57 if rcount % 3 == 0: # 3回ごとに実行 58 ans_sum_num3.append(stotal) # 合計を取得 59 stotal = 0 # 小計をリセット 60 61ans1=[] 62for i in range(len(ans_sum_num2)): 63 ans1.append(int(ans_sum_num2[i]/(a_str[1]*a_str[1]))) 64 65ans2=[] 66for i in range(len(ans_sum_num3)): 67 ans2.append(int(ans_sum_num3[i]/(a_str[1]*a_str[1]))) 68 69print(" ".join(map(str, ans1))) 70print(" ".join(map(str, ans2)))

///色々な方の書くコードを読むのって楽しいですね

投稿2017/06/23 12:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問