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

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

新規登録して質問してみよう
ただいま回答率
87.20%
並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

受付中

pythonで書かれたコードの並列化を用いた処理の高速化について

mjacay
mjacay

総合スコア0

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1回答

1評価

1クリップ

121閲覧

投稿2022/05/06 00:35

センサーからデータを取り出すための関数が7つあり、これらを直列に実行する場合と並列に処理する場合の実行時間を比較したプログラムを作成しております。各関数の実行時間を1秒としたとき、直列に実行すれば7秒ほどの実行時間がかかりますが、並列処理にすることで2秒ほどに短縮できます。一方で、各関数の実行時間を0.005秒とすると、並列化の恩恵を見込めず、直列処理の実行時間とほぼ同じになりました。
理想的には、並列化をすることで各関数の実行時間ほどに効率化ができればと思ったのですが、目論見は失敗しました。
並列化のために使用しているライブラリはconcurrent.futuresのThreadPoolExecutorを使用しています。
あくまで仮説ですが、PythonにはGILの制約があるため、同時に実行されるスレッドが一つに制約されるので、一つのスレッドを呼び出すための時間 > 各関数の実行時間の関係が成り立つ場合、いくら並列化をしても各関数の実行時間よりも早くなることは無いのではないかと考えています。
(GILロックを回避した並列処理の実装が必要?)
上記に関して改善策や知見などありましたらご教授いただきたいです。

下記は実験に使用したコードになります。よろしくお願いいたします。

python

import time from time import perf_counter import numpy as np from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor def wait_process(wait_sec): until = perf_counter() + wait_sec while perf_counter() < until: pass return def get_euler(waittime): wait_process(waittime) x, y, z = 1, 1, 1 return x, y, z def get_gyro(waittime): wait_process(waittime) x,y,z = 2,2,2 return x,y,z def get_accel(waittime): wait_process(waittime) x, y, z = 10, 10, 10 return x, y, z def get_liner_acc(waittime): wait_process(waittime) x, y, z = 1, 1, 1 return x, y, z def get_gravity(waittime): wait_process(waittime) x, y, z = 1, 1, 1 return x, y, z def get_quaternion(waittime): wait_process(waittime) w, x, y, z = 1, 1, 1, 1 return w, x, y, z def get_calib_status(waittime): wait_process(waittime) w, x, y, z = 3, 3, 3, 3 return w, x, y, z def single_process(waittime): start = time.time() get_gyro(waittime) end = time.time() print('elepsed_time:{0}[s]'.format(end-start)) def stream_process(waittime = 0.005): start = time.time() ex, ey, ez = get_euler(waittime) gx, gy, gz = get_gravity(waittime) ax, ay, az = get_accel(waittime) lax, lay, laz = get_liner_acc(waittime) rx, ry, rz = get_gyro(waittime) qw, qx, qy, qz = get_quaternion(waittime) a, b ,c, d = get_calib_status(waittime) end = time.time() print('elepsed_time:{0}[s]'.format(end-start)) return ex, ey, ez, gx, gy, gz, ax, ay, az, lax, lay, laz, rx, ry, rz, qw, qx, qy, qz, a, b, c, d def get_all_data(sensor, waittime=0.005): if sensor == 'euler': x, y, z = get_euler(waittime) return x, y, z elif sensor == 'gyro': x, y, z = get_gyro(waittime) return x,y,z elif sensor == 'linear_acc': x,y,z=get_liner_acc(waittime) return x,y,z elif sensor == 'gravity': x, y, z = get_gravity(waittime) return x,y,z elif sensor == 'acceleration': x, y, z = get_accel(waittime) return x, y, z elif sensor == 'quaternion': w, x, y, z = get_quaternion(waittime) return w, x, y, z elif sensor == 'calib_status': a, b, c, d = get_calib_status(waittime) return a, b, c, d else: pass def pararel_process(n): start = time.time() sensors = ['euler', 'gyro', 'gravity', 'acceleration', 'linear_acc', 'quaternion', 'calib_status'] result = [] with ThreadPoolExecutor(max_workers=n) as e: ret = e.map(get_all_data, sensors, chunksize=1) sms_multi = [r for r in ret] for res in sms_multi: for i in range(len(res)): result.append(res[i]) end = time.time() print('elepsed_time:{0}[s]'.format(end - start)) if __name__ == '__main__': waittime = 0.005# 実行時間の仮定 worker = 7 single_process(waittime)# シングル stream_process(waittime)# 直列処理 pararel_process(n=worker) # 並列処理

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

meg_

2022/05/06 04:19

> 一方で、各関数の実行時間を0.005秒とすると こちらの方が現実的なのですか?
mjacay

2022/05/06 10:23

0.005秒と言う数字は、あるセンサーから値を取り出すために必要な実行時間において最悪のケースになります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。