2016-12-07 20 views
0

私はpythonコードをcythonで固定しようとしています。Cythonで(effienciently)文字列を作成する方法は?

私が削除しようとするボトルネックの1つは、ループ内にファイル名(文字列)を構成することです。 しかし、私は再cythonの方法で、私のpythonコードを記述するために管理していない:

cdef str filename, path 

for ii in range(len(a0)): 
    for jj in range(len(a1)): 
     filename = self.path + 'directory' + format(int(lon[ii,jj]),'02d')+ '_' + format(int(lat[ii,jj]),'02d') + '.csv' 

これははるかに高く評価されるだろう書き換える方法上の任意のヘルプを! ありがとう

+0

"a0"、 "a1"、 "ii"、 "jj"などの変数は使用しないでください。また、変数が 'for a0 in a0'または同等のものであれば、' range(len(a0)) 'を実行する必要はありません。 – joeb

+0

'format'は文字列' + 'と同様に' Python'関数です。 'lon [ii、jj]'のインデクシング( 'numpy')もそうです。 'cython'が '純粋な' C言語に変換できることはあまりありません。 – hpaulj

+0

' cython'文字列の概要を見てください。http://cython.readthedocs.io/en/latest/src/tutorial/strings.html文字列操作を高速化することはあまりできないことを示唆しています。 'c'文字列の使用をお勧めしません。 'C++'文字列ライブラリへのインタフェースが機能するかもしれません。 – hpaulj

答えて

0

私はあなたがPythonで書式設定を高速化できると思う。たとえば、次の開始1つの書式文字列を作成し、繰り返し使用することを、すなわち

In [71]: names=[] 
In [72]: fmt='path/'+'directory/'+'%02d_%02d.csv' 
In [73]: for i in range(lat.shape[0]): 
    ...:  for j in range(lat.shape[1]): 
    ...:  name = fmt%(lat[i,j],lat[i,j]) 
    ...:  names.append(name) 

In [67]: lat=np.arange(6).reshape(2,3) 
In [68]: names=[] 
In [69]: for i in range(lat.shape[0]): 
    ...:  for j in range(lat.shape[1]): 
    ...:  name = 'path/'+'directory'+format(lat[i,j],'02d')+'_'+format(lat 
    ...: [i,j]+3,'02d')+'.csv' 
    ...:  names.append(name) 
    ...:   
In [70]: names 
Out[70]: 
['path/directory00_03.csv', 
'path/directory01_04.csv', 
'path/directory02_05.csv', 
'path/directory03_06.csv', 
'path/directory04_07.csv', 
'path/directory05_08.csv'] 

は、以下のように再加工することができます。

またはPY3スタイルformat用:

fmt = 'path/directory{:02d}_{:02d}.csv' 
name = fmt.format(lat[i,j],lat[i,j]) 

クイックタイムテストは2-3のx高速化(古い%スタイルでより多くを)提案します。

関連する問題