実現したいこと
「該当のソースコード」は、こちらの途中まで切り出したものです。このコードは正しく動きます。
「該当のソースコード」の31行目以降に度々出てくる[1:-1,1:-1,1:-1] のような書き方にまだ慣れなくて、読みづらいと思い、29~43行目を以下のように直してみました。両者で出力されるファイルの中身(p[HLN]-1.csvとp[HLN]-2.csv)は同じなのですが、p[HLN]-1.csvが出力されるのにはものすごく時間がかかりました。
スライスを使った書き方をした方が圧倒的に計算時間が短くなるので、今後はこのような書き方に慣れた方が良いということでしょうか。もしくは、スライスを使わない書き方で、私のコード(p[HLN]-1.csvを出力するコード)よりも計算時間が早くなるような書き方がありましたら教えてください。スライスに慣れていないので、安全のためスライスを使わない高速コードがあれば嬉しいです。
python
1omega = 1 2for I in range(500): 3 pd = p.copy()#p[HLN]-2.csvと同じ値になるかを確認するために、あえてコピーする 4 5 for i in range(0,nx,1): 6 for j in range(0,ny,1): 7 for k in range(0,nz,1): 8 if k ==0 or k ==nz-1 or j==0 or j==ny-1 or i ==0 or i ==nx-1: 9 p[i][j][k] = 0 10 else: 11 p[i][j][k] = (1-omega)*pd[i][j][k]+omega *(pd[i+1][j][k]+pd[i-1][j][k]+pd[i][j+1][k]+pd[i][j-1][k]+pd[i][j][k+1]+pd[i][j][k-1]+delta_L**2*charge[k][j][i]/eps0)/6 12 13filenamecsv = "p[HLN]-1.csv" 14np.savetxt(filenamecsv, p[HLN], delimiter=",")
該当のソースコード
python
1import numpy as np 2 3delta_L=1 4LN=50 5HLN=int(LN/2) 6nx = LN+1 7ny = LN+1 8nz = LN+1 9xmin = 0 10xmax = LN*delta_L 11ymin = 0 12ymax = LN*delta_L 13zmin = 0 14zmax = LN*delta_L 15 16p = np.zeros((nz, ny, nx)) 17pd = np.zeros((nz, ny, nx)) 18charge = np.zeros((nz, ny, nx)) 19x = np.linspace(xmin, xmax, nx) 20y = np.linspace(ymin, ymax, ny) 21z = np.linspace(zmin, zmax, nz) 22print(x) 23eps0=1 #とりあえず 24Q=1 25q=Q/delta_L**3 # 電荷密度に変換 26 27charge[HLN][HLN][HLN]=q 28 29for I in range(500): 30 pd = p.copy() 31 p[1:-1,1:-1,1:-1] = (pd[2:,1:-1,1:-1] + pd[:-2,1:-1,1:-1] + 32 pd[1:-1,2:,1:-1] + pd[1:-1,:-2,1:-1] + 33 pd[1:-1,1:-1,2:] + pd[1:-1,1:-1,:-2] + (delta_L**2)*charge[1:-1, 1:-1, 1:-1]/eps0) /6 34 35 p[0][:][:]=0 36 p[nx-1][:][:]=0 37 p[:][0][:]=0 38 p[:][ny-1][:]=0 39 p[:][:][0]=0 40 p[:][:][nz-1]=0 41 42filenamecsv = "p[HLN]-2.csv" 43np.savetxt(filenamecsv, p[HLN], delimiter=",")
試したこと
Googleで「スライスで書くと計算時間が短くなる」で検索すると、以下のように表示されます。
AIによる概要
スライス表記でコードを書くと、計算時間が短縮される場合があります。特に、リストや配列の特定の範囲を扱う際に、スライスを使用することで、元のリストや配列をコピーせずに済むため、処理が高速化されることがあります。ただし、常にスライスが最速とは限りません。データ構造や操作の種類によっては、他の方法がより効率的な場合もあります。

回答2件
あなたの回答
tips
プレビュー