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

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

新規登録して質問してみよう
ただいま回答率
87.20%
ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

受付中

階乗のループがある複雑ネットワーク解析プログラムを高速化したい

Dobutori
Dobutori

総合スコア1

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

2回答

0評価

2クリップ

435閲覧

投稿2022/01/05 05:51

実現したいこと

複雑ネットワークでウィルスが感染する様子を調べたいのですがデータの数が多く処理に時間が掛かってしまうため高速したいです。
###プログラムの概要
1step毎に7000~10000の数のノードデータ(ノードの名称id,x座標、y座標)が記載されたものが1800stepまであり、1step毎に読み込み、感染ノードであれば1を、それ以外のとき0をnode_listの最後に追加します。その後、関数を呼び出しノード同士の座標をそれぞれ比較して、座標の距離を求めて範囲内であれば感染リストに格納します。感染リストは、次のstep時に、参照して、新たに感染リストに追加していきます。stepの最後に時間と感染リストの数を出力します。

発生している問題・エラーメッセージ

1step毎にノードの数の階乗回for文でループしているため、1stepあたり約40秒ほど時間がかかってしまってしまい、1800秒間では約20時間掛かっています。

該当のソースコード

Python

import sys import random import math import time import re #2点の差が縦横100mの距離の長さ #sqrt(100^2+100^2) D_100=math.sqrt((100*100)+(100*100)) Input = "node_data.txt" Output="output.txt" def file_write(output,infeced_list,t): with open(output, 'a') as f: f.write("%d %d\n" % (t,len(infeced_list))) f.close() def SUMOTraceParser(): #ファイルオープン f1 = open(FCDOutput, 'r') node_list = [] # ノードデータ保存リスト((車のid,x,y,レーン)) infected_list=[] #感染リスト(id) row_no = 0 #行数カウント while True: line = f1.readline() line = line.replace("\n", "") # 改行削除 #timestep if "timestep" in line: t = re.sub(r"[^\d.]", "", line) t = int(float(t)) row_no+=1 #ノードデータ読み込み、node_listに追加 elif "end" not in line and "timestep" not in line: row_no += 1 # 分割 l = line.split(',') # ダブルコーテション削除 for i in range(len(l)): l[i] = l[i].replace("''", "") l[i]=float(l[i]) l[i]=int(l[i]) # 感染リストにidがあるとき if l[0] in infected_list: node_list.append((l[0],l[1],l[2], 1)) #1を追加 else: node_list.append((l[0],l[1],l[2], 0)) #0を追加 #1stepの読み込み終了時 elif "end" in line: test_list=Infect(node_list,t,infected_list) #関数呼び出し infected_list=test_list file_write(Output,infected_list,t) #ファイルに感染したノードを書き込み node_list=[] row_no+=1 if t == 1800: # 強制終了 sys.exit() #ノード同士を比較して、感染リストに格納する関数 def Infect(node_list, t, infected_list): node_list.sort() #sort node_list2=reversed(node_list) #revresed node_id_list=set() #idリスト   #node_listを階乗回ループする for i in range(len(node_list)): for j in range(len(node_list2)-i): A=None #x,y差を止める x_1=node_list[i][1] - node_list[j][1] y_1=node_list[i][2] - node_list[j][2] #2乗する x_2=pow(x_1,2) y_2=pow(y_1,2) D=math.sqrt(x_2+y_2) #2点間の距離計算 if D<D_100: if node_list[i][0] != node_list[j][0]: #同一ノードではないとき # どちらかが1(感染状態)のとき if node_list[i][3] == 1 and node_list[j][3] == 0: A=True if node_list[i][3] == 0 and node_list[j][3] == 1: A=True if A==True: A=None # 確率1%の確率で b=random.random() if b < 0.1:  infected_list.append(node_list[j][0]) #感染リストに追加 node_id_list.add(node_list[i][0]) # 感染するノードをランダムに選択 if t==start_s: infected_list=random.sample(node_id_list,1) # リストの重複を削除 infected_list = list(set(infected_list)) return infected_list if __name__ == '__main__': SUMOTraceParser()

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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