2016-12-07 9 views
0

Я пытаюсь закрепить мой код python с помощью cython.Как (эффектно) построить строку в Китоне?

В cython одним из узких мест, которые я пытаюсь удалить, является построение имени файла (строки) в цикле. Однако мне не удается повторно написать свой питона код в Cython образом:

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' 

Любая помощь о том, как переписать это будет высоко ценится! Thanks

+0

Пожалуйста, не используйте переменные типа «a0», «a1», «ii» и «jj» - их трудно рассуждать. Также вам не нужно делать 'range (len (a0))', если ваша переменная итерируется, просто выполните 'for ii in a0' или ее эквивалент. – joeb

+0

'format' - это функция' Python', как и строка '+'. Так же называется индексирование 'lon [ii, jj]' ('numpy'). Существует не так много, что 'cython' может преобразовать в 'pure' C. – hpaulj

+0

Быстрый взгляд на строки' cython' docs, http://cython.readthedocs.io/en/latest/src/tutorial/strings.html , предполагает, что он не может многое сделать для ускорения операций с строкой. Они препятствуют использованию строк 'c'. Взаимодействие с библиотекой строк 'C++' может работать. – hpaulj

ответ

0

Я подозреваю, что вы можете ускорить форматирование в Python. Например:

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'] 

могут быть переработаны как:

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) 

Другими словами, создать одну строку формата в начале, и использовать его повторно.

Или стили PY3 format:

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

Быстрые тесты времени предлагает 2-3 х (ускорение больше со старым % стилем).