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

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

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

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

Q&A

解決済

1回答

715閲覧

lineprofilerが実行できない

nasumax

総合スコア10

Python

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

0グッド

0クリップ

投稿2022/11/22 07:45

前提

pythonのコードを高速化するためにlineprofilerを試してみたのですが、実行するとprof.runcallのところでエラーが出てしまいます。解決方法を教えていただきたいです。

実現したいこと

lineprofilerを実行する

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

エラーメッセージ TypeError Traceback (most recent call last) Input In [6], in <cell line: 102>() 100 prof = LineProfiler() 101 prof.add_function(initial(dt, T1, x10_i, x20_i, y10_i, y20_i, k, gamma, σ)) --> 102 prof.runcall(initial(dt, T1, x10_i, x20_i, y10_i, y20_i, k, gamma, σ)) 103 prof.print_stats() File ~\aa\lib\site-packages\line_profiler\line_profiler.py:170, in LineProfiler.runcall(self, func, *args, **kw) 168 self.enable_by_count() 169 try: --> 170 return func(*args, **kw) 171 finally: 172 self.disable_by_count() TypeError: 'tuple' object is not callable ### 該当のソースコード ```ここに言語名を入力 ソースコード from line_profiler import LineProfiler import numpy as np kBT = 4.14E-21 # (J = kg m^2 / s^2) def initial(dt, T1, x10_i, x20_i, y10_i, y20_i, k, gamma, σ): # 時間刻み dt で T だけ計算 def potential_i(t,X,Y): U=-1E-25/((2*np.pi)**(1/2)*σ)*(1/2)*(np.exp(-((X**2+Y**2)**(1/2)-μ)**2/(2*σ**2))+np.exp(-((X**2+Y**2)**(1/2))**2/(2*σ**2))-np.exp(-(X**2+(Y-a)**2)/(2*σ**2))-np.exp(-(X**2+(Y+a)**2)/(2*σ**2))) return U n1 = int(T1 / dt) # ステップ数 w = np.sqrt(2*kBT*dt/gamma) # ルートの中にdtを入れる r1 = np.random.standard_normal(size = n1 - 1) # n-1個の正規乱数(平均0, 分散1)を発生. r2 = np.random.standard_normal(size = n1 - 1) r3 = np.random.standard_normal(size = n1 - 1) r4 = np.random.standard_normal(size = n1 - 1) x1 = np.zeros(n1) x1[0] = x10_i # m, 初期位置 y1 = np.zeros(n1) y1[0] = y10_i x2 = np.zeros(n1) x2[0] = x20_i y2 = np.zeros(n1) y2[0] = y20_i t = np.linspace(0, T1 - dt, n1) Win=0 Qin=0 for i in range(n1-1): R1=(x1[i]**2+y1[i]**2)**(1/2) R2=(x2[i]**2+y2[i]**2)**(1/2) E01=np.exp(-(R1**2)/(S)) E02=np.exp(-(R2**2)/(S)) E1=np.exp(-((R1**2)**(1/2)-μ)**2/(S)) E2=np.exp(-((R2**2)**(1/2)-μ)**2/(S)) Ea11=np.exp(-(x1[i]**2+(y1[i]-a)**2)/(S)) Ea12=np.exp(-(x1[i]**2+(y1[i]+a)**2)/(S)) Ea21=np.exp(-(x2[i]**2+(y2[i]-a)**2)/(S)) Ea22=np.exp(-(x2[i]**2+(y2[i]+a)**2)/(S)) Efc0=np.exp(-δ*((x1[i]-x2[i])**2 + (y1[i]-y2[i])**2)**0.5)/((x1[i]-x2[i])**2 + (y1[i]-y2[i])**2)**1.0 Efc=np.exp(-δ*((x2[i]-x1[i])**2 + (y2[i]-y1[i])**2)**0.5)/((x2[i]-x1[i])**2 + (y2[i]-y1[i])**2)**1.5 fx1 = -1E-25/((2*np.pi)**(1/2)*σ**3)*A*x1[i]*((R1-μ)/(R1)*E1+E01-Ea11-Ea12) fcx1 = 1.0*(x1[i]-x2[i])*k*δ*Efc0 + 1.0*(x1[i]-x2[i])*k*Efc x1[i + 1] = x1[i] + dt * (fx1 + fcx1) / gamma + w * r1[i] fy1 = -1E-25/((2*np.pi)**(1/2)*σ**3)*A*y1[i]*((R1-μ)/(R1)*E1+E01-(y1[i]-a)/y1[i]*Ea11-(y1[i]+a)/y1[i]*Ea12) fcy1 = 1.0*(y1[i]-y2[i])*k*δ*Efc0 + 1.0*(y1[i]-y2[i])*k*Efc y1[i + 1] = y1[i] + dt * (fy1 + fcy1) / gamma + w * r2[i] fx2 = -1E-25/((2*np.pi)**(1/2)*σ**3)*A*x2[i]*((R2-μ)/(R2)*E2+E02-Ea21-Ea22) fcx2 = 1.0*(x2[i]-x1[i])*k*δ*Efc0 + 1.0*(x2[i]-x1[i])*k*Efc x2[i + 1] = x2[i] + dt * (fx2 + fcx2) / gamma + w * r3[i] fy2 = -1E-25/((2*np.pi)**(1/2)*σ**3)*A*y2[i]*((R2-μ)/(R2)*E2+E02-(y2[i]-a)/y2[i]*Ea21-(y2[i]+a)/y2[i]*Ea22) fcy2 = 1.0*(y2[i]-y1[i])*k*δ*Efc0 + 1.0*(y2[i]-y1[i])*k*Efc y2[i + 1] = y2[i] + dt * (fy2 + fcy2) / gamma + w * r4[i] U0W = potential_i(t[i],x2[i],y2[i]) U1W = potential_i(t[i+1],x2[i],y2[i]) Wi = U1W-U0W Win += Wi U0Q = potential_i(t[i+1],x2[i],y2[i]) U1Q = potential_i(t[i+1],x2[i+1],y2[i+1]) Qi = U1Q-U0Q Qin += Qi global x10_m, x20_m, y10_m, y20_m x10_m = x1[n1-2] y10_m = y1[n1-2] x20_m = x2[n1-2] y20_m = y2[n1-2] return t, x1, x2, y1, y2, Win, Qin η = 0.890E-3 #(Pa*s) r = 0.25E-6 # (m) gamma = 6*np.pi*η*r # (kg/s) D = kBT/gamma tau = 0.1 # (s) トラップの時定数 k = 5E-20 δ=1E7 T1 = 0.1 # (s) 計算時間 T2 = 0.5 T3 = 1 T4 = 11 T5 = 0.5 Tc = T1+T2+T3+T4+T5 dt = 0.5E-3 # (s) 計算の時間刻み σ=1/6*1E-6 S=2*σ**2 μ=1.5E-6 a=1.5E-6 b=0.5E-6 c=0.5E-6 c0=0.5E-6 e=20 m=0 f=1/4 f2=2 f3=2 A=1/2 x10_i = 1.5E-6 # (m) 初期位置.少し離れたところからスタートして,緩和の様子を見てみる. x20_i = 1E-9 y10_i = 1E-9 y20_i= 1E-9 arg0=0 prof = LineProfiler() prof.add_function(initial(dt, T1, x10_i, x20_i, y10_i, y20_i, k, gamma, σ)) prof.runcall(initial(dt, T1, x10_i, x20_i, y10_i, y20_i, k, gamma, σ)) prof.print_stats() ### 試したこと ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

APIの使いかたが間違えているからだと思います。

python

1prof = LineProfiler() 2prof.add_function(initial(dt, T1, x10_i, x20_i, y10_i, y20_i, k, gamma, σ)) 3prof.runcall(initial(dt, T1, x10_i, x20_i, y10_i, y20_i, k, gamma, σ)) 4prof.print_stats()

2行目は add_function(関数を追加)ですが、ここで関数を実行してしまっています。これでは、実行結果(たぶんタプル)が関数として登録されてしまいます。 なので「TypeError: 'tuple' object is not callable」というエラーになります。

また、prof.runcall も引数にできるのは関数のみなので、 initialを引数付きで実行する別の関数(もしくはラムダ式)を引数に指定する必要があります。

動かないかもしれませんが以下のような感じです。

python

1prof = LineProfiler() 2prof.add_function(initial) 3 4def run_initial(): 5 initial(dt, T1, x10_i, x20_i, y10_i, y20_i, k, gamma, σ) 6prof.runcall(run_initail) 7 8# もしくはラムダ式 9# prof.runcall(lambda: initial(dt, T1, x10_i, x20_i, y10_i, y20_i, k, gamma, σ)) 10 11prof.print_stats()

ちなみに、本家を見てもこの方式の使いかたの詳しい説明がありませんね。

投稿2022/11/22 08:24

編集2022/11/22 08:25
TakaiY

総合スコア12743

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

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

nasumax

2022/11/25 04:31

この通りに修正したらできました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問