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

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

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

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

Python

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

Q&A

解決済

1回答

713閲覧

ループ内のモジュールの実行

aochan01

総合スコア17

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/12/21 06:52

前提・実現したいこと

pythonでのモンテカルロシミュレーション
現在runpyでできないループ内でのモジュールの実行による乱数の計算

発生している問題

毎回aの値が変わるはずがrunpyが都度実行されていないようでそうならない moduleでは乱数が生成されてb,cが計算されている(毎回値が異なるのは確認済み)

該当のソースコード

python

1#都合問題の部分を簡易的に記述 2import module,runpy 3i=0 4n=100 5while i<n: 6 runpy.run_module('module') 7 a=module.b-module.c 8 alist.append(a) 9 i+=1

試したこと

subprocessによるmodule.pyの実行(問題は解決しないし非常に重くなる)
モジュール内でaの計算を行う(同じく解決しない)

補足情報(FW/ツールのバージョンなど)

pythonは3以降
runpyの適切な設定で改善すればそれがベスト
runpyのドキュメンテーションはよくわからなかった
ループの中にrunpyを入れているが内部的には固定されている?

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

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

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

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

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

can110

2018/12/21 08:08 編集

類似現象は再現しました。moduleのソースを提示ください。
aochan01

2018/12/21 09:05

非常にざっくりとにはなりますがこのようになって確率変数を扱っています この値がメインのループで乱数から様々な値をとるようにしたいです #sub module import random d=random.gauss(10,1) e=random.gauss(100,10) b=d*e c=d/e
guest

回答1

0

ベストアンサー

同様現象が再現できました。

runpy — Python モジュールの位置特定と実行によると

これはサンドボックスモジュール ではない ことに注意してください。すべてのコードは現在のプロセスで実行され、あらゆる副作用 (たとえば他のモジュールのキャッシュされたインポート等) は関数から戻った後にそのまま残ります。

さらに、 runpy 関数から戻った後で、実行されたコードによって定義された任意の関数およびクラスが正常に動作することは保証されません。

とあるので、呼出後にはモジュール内部の変数の値も変わらないと推測できます。

しかし一方

runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)(原文)

指定されたモジュールのコードを実行し、実行後のモジュールグローバル辞書を返します。モジュールのコードはまず標準インポート機構(詳細は PEP 302 を参照) を使ってモジュールの位置を特定され、まっさらなモジュール名前空間で実行されます。

と記載があるので、戻り値のグローバル辞書からbとcのまっさらな状態からの実行結果値を取得することはできそうです。ということで

Python

1import m, runpy # module -> m と記載 2for i in range(10): 3 ret = runpy.run_module('m') 4 print('m.b-m.c={},ret["b"]-ret["c"]={}'.format(m.b-m.c, ret["b"]-ret["c"])) 5""" 6m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=1002.1855023056205 7m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=953.6006614136874 8m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=785.3018135224241 9m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=780.7504193302373 10m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=997.0539166255655 11m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=798.4232457394988 12m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=938.8993618208882 13m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=1046.969906938842 14m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=1137.8183338647862 15m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=830.4924045993087 16"""

にてret["b"]ret["c"]は毎回異なる値となることが確認できました。

投稿2018/12/21 09:23

編集2018/12/21 09:32
can110

総合スコア38234

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

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

aochan01

2018/12/21 09:45

こちらでも確認できました strをfloatに変換して無事メインのモンテカルロシミュレーションもまわります 大変ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問