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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

4回答

2579閲覧

Rubyのループ処理の処理時間を速くしたい

ryota1017stars

総合スコア21

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/09/04 15:32

編集2019/09/04 22:41

下記のrubyで書かれたループ処理ですが、処理時間をより速くする記述方法を
教えていただきたいです。

ruby

1 2(0..10000).each do |i| 3 4 abs_an = 0 5 6 (0...100).each do |j| 7 8 answer = arr1[i][j] - arr2[i][j] 9 10 abs_an += answer.abs 11 end 12end

よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

Ruby

1 (0..10000).each do |i| 2 abs_an = 0 3 arr1[i].zip(arr2[i]){|x,y| abs_an+=(x-y).abs} 4 end

くらいでしょうか。

投稿2019/09/05 04:43

otn

総合スコア84533

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

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

otn

2019/09/05 06:17

0.07959757199932938 ↓ 0.06609493399810162 と若干の短縮です。
guest

0

abs_anを求めるのが目的なら、以下のようになります。

ruby

1i = 10000 2abs_an = 0 3(0...100).each do |j| 4 answer = arr1[i][j] - arr2[i][j] 5 abs_an += answer.abs 6end

投稿2019/09/04 22:49

tatsu99

総合スコア5438

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

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

0

ベストアンサー

私の結論は、改善出来そうにない、です。
3パターンためしてみました。

2重ループを1重にするために、 fary1 = arry1.flatten してみた。
=> flattenして新しく領域確保するコストが大きいようで、倍。

2重ループを1重にするために、 cnt = 101 * 10001 - 1 として
(0..cnt).each{|i| arry[i/101][i%101] としてみた。
=> 50%まし

injectを使ってみた 10%増し。

##
ループと、加減算と、abs とのコストを見てみました
全体 0.08
abs無し 0.07
ループだけ 0.03
すると
加減算と代入が 0.04
absが     0.01
ループが    0.03

加減算と代入を軽く出来ないかと考えたinjectがむしろ遅い
ループを1重にできても0.015

となると劇的に早くは難しそうです。

投稿2019/09/05 05:56

winterboum

総合スコア23329

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

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

0

参考として、そちらの環境での実行時間を教えていただきたいです。
私の環境ではだいたい0.1秒くらいで処理が終わります。

Ruby

1require 'benchmark' 2 3arr1 = [] 4arr2 = [] 5 6[arr1, arr2].each do |arr| 7 10001.times do 8 arr << (0..101).to_a 9 end 10end 11 12result = Benchmark.realtime do 13 (0..10000).each do |i| 14 abs_an = 0 15 (0...100).each do |j| 16 answer = arr1[i][j] - arr2[i][j] 17 abs_an += answer.abs 18 end 19 end 20end 21 22puts result

実行時間

0.11113919999979771 0.11229739999998856 0.11387449999983801

環境:
Ruby 2.5.3p105 (2018-10-18 revision 65156) [i386-mingw32]
Windows バージョン - Windows 10 (64 bit)
システム メモリー - 16 GB
CPU の種類 - AMD Ryzen 7 2700X Eight-Core Processor

投稿2019/09/04 23:02

編集2019/09/04 23:07
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ryota1017stars

2019/09/05 11:26

今回の質問はpaizaスキルチェックの問題に取り組み、処理時間が長過ぎたために不合格となってしまった失敗から生まれました。従ってpaiza.ioで上記コードを実行しました。結果、0.0799でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問