実現したいこと
どうしても、ユーザーが入力したテキストファイルに記述してある式を実行する必要があります。
eVal()関数で実行はできたのですが、同じ式を10000回繰り返す必要があり
もともとのPythonプログラムに記述した場合と比べて、かなり遅い結果となることがわかりました。
プログラム実行中にテキストファイルに記述する式が変化するのであれば
eVal()で文字列を都度、式に評価する以上、遅くなるのは仕方ないと思いますが
プログラム起動時のみテキストファイルに記述している文字列を1度だけ読み込むので
高速化できるのであればしたいと考えています。
発生している問題・分からないこと
高速化する方法がわからない
該当のソースコード
Python
1import math 2import time 3 4 5def read_expressions(filename): 6 try: 7 with open(filename, 'r') as file: 8 return [line.strip() for line in file if line.strip()] 9 except FileNotFoundError: 10 print(f"ファイル '{filename}' が見つかりません。") 11 return [] 12 except Exception as e: 13 print(f"ファイル読み込み中にエラーが発生しました: {str(e)}") 14 return [] 15 16 17def evaluate_expression(expression, variables): 18 # 文字列をeVal関数で評価して実行する 19 # セキュリティのため四則演算と三角関数、ルート、pi、e、最大、最小、絶対値以外の関数は使わせない 20 # main関数で定義している変数は使用OK 21 safe_dict = { 22 'abs': abs, 'max': max, 'min': min, 23 'sin': math.sin, 'cos': math.cos, 'tan': math.tan, 24 'sqrt': math.sqrt, 25 'pi': math.pi, 'e': math.e 26 } 27 safe_dict.update(variables) 28 29 try: 30 result = eval(expression, {"__builtins__": None}, safe_dict) 31 return result 32 except Exception as e: 33 return f"エラー: {str(e)}" 34 35 36def main(): 37 38 # ユーザーがテキストファイルに書いた式(文字列)をロードする 39 filename = "expressions.txt" 40 expressions = read_expressions(filename) 41 42 kakudo_Value = 30 43 Force_Value = 10.55 44 45 variables = { 46 'kakudo_Value': kakudo_Value, 47 'Force_Value': Force_Value 48 } 49 50 for expression in expressions: 51 52 # ユーザーが設定したテキストファイルの式を10000回繰り返す 53 start_time = time.time() 54 for i in range(10000): 55 result = evaluate_expression(expression, variables) 56 print(time.time() - start_time) 57 print(f"式: {expression}") 58 print(f"結果: {result}") 59 60 # 【比較用】ユーザーが設定したテキストファイルの式と同じ式を10000回繰り返す 61 start_time = time.time() 62 for i in range(10000): 63 kekka = math.sin(kakudo_Value * math.pi / 180) * Force_Value 64 print(time.time() - start_time) 65 print(f"結果: {kekka}") 66 67 68if __name__ == "__main__": 69 main() 70
sin(kakudo_Value * pi / 180) * Force_Value
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
functools.cacheを使えばいいかもと思いましたが、ソースコード上では定数として設定している変数のkakudo_ValueとForce_Valueは、実際には変化しますので、あまり高速化できないのでは無いかと考えました。
補足
特になし
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/11/15 09:22