2016-09-22 2 views
1

В куске кода, где я просматриваю файлы, которые отформатированы иначе, чем то, что я хочу, я испытываю значительное замедление.Советы по обертке файлов быстрее

Замедление составляет порядка 2 часов для обработки 500 файлов, каждая из которых имеет приблизительно 1000 строк. Мне нужно сделать это еще много раз, поэтому любой вклад в почему он настолько медленный и как сделать его быстрее приветствуется. Вот мой код:

f массив, который у меня есть с информацией о поиске файлов.

def athwrap(athfpath, savefpath, fdirection): 
    ath = [] 
    with open(athfpath, 'r') as file: 
     for j, line in enumerate(file): 
      if j == 6: 
       npts = int(line[5:12]) 
       dt = float(line[17:25]) 
       ath = np.array((fdirection, npts, dt)) 
      elif j > 6: 
       uys = [float(n) for n in line.split()] 
       ath = np.hstack((ath, uys)) 
       if not os.path.isdir(savefpath): 
        os.makedirs(savefpath, exist_ok=True) 
       np.savetxt(savefpath + f[i, 15] + '.txt', ath, fmt='%s') 
    file.close() 

# Search and Wrap Files 
k = 1 
for i in range(0, len(f)): 
    athpath = path + f[i, 16] + '/' + f[i, 15] + '.ATH' 
    savepath = savpath + f[i, 16] + '/' 
    if os.path.isfile(athpath): 
     if k % 3 == 0: 
      direction = "Y" 
      athwrap(athpath, savepath, direction) 
     elif k % 2 == 0: 
      direction = "X" 
      athwrap(athpath, savepath, direction) 
     else: 
      direction = "Z" 
      athwrap(athpath, savepath, direction) 
    else: 
     print("Could find file " + loc + '/' + site + '/' + f[i, 16] + '/' + f[i, 15]) 
    k += 1 
+0

Является ли ваша линия 'np.savetxt' работающей по назначению? Кажется, он многократно перезаписывает один и тот же файл в функции 'athwrap', так как' i' не изменяется во время цикла над входным файлом. Если вы намереваетесь просто написать один раз, вы, вероятно, захотите отменить эту строку на том же уровне, что и 'for'. Если вы хотите написать каждую строку в другом файле, вы, вероятно, захотите использовать 'j' в вашем поиске в' f' (и, возможно, бит 'hstack' по-другому, я не уверен). – Blckknght

+0

Вам не нужно (и вы не можете) закрыть дескриптор файла после оператора 'with', который его открывает; он автоматически закрывается. – chepner

+0

Существует очень мало очевидной связи между заголовком и текстом этого вопроса - кто-то, кто действительно хочет знать, насколько значительны накладные расходы производительности, связанные с 'enumerate', здесь, вероятно, будет разочарован. Неужели вы можете найти лучший заголовок, чтобы сделать его более полезным для будущих читателей? –

ответ

0

Отступ был спасателем жизни!

def athwrap(athfpath, savefpath, fdirection): 
    ath = [] 
    with open(athfpath, 'r') as file: 
     for j, line in enumerate(file): 
      if j == 6: 
       npts = int(line[5:12]) 
       dt = float(line[17:25]) 
       ath = np.array((fdirection, npts, dt)) 
      elif j > 6: 
       uys = [float(n) for n in line.split()] 
       ath = np.hstack((ath, uys)) 
    if not os.path.isdir(savefpath): 
     os.makedirs(savefpath, exist_ok=True) 
    np.savetxt(savefpath + f[i, 15] + '.txt', ath, fmt='%s') 
+1

Почему 'file.close()'? Весь смысл 'with open (...) как файла:' заключается в том, что он автоматически закрывается при выходе из блока. –

+0

Отредактировано. Большое спасибо! –

2

Не постоянно проверяйте, в какой строке вы находитесь. Постройте это в структуру вашего кода.

def athwrap(athfpath, savefpath, fdirection): 
    ath = [] 
    with open(athfpath, 'r') as file: 
     # Ignore the first 6 lines, and keep the 7th 
     for __ in range(7): 
      line = next(file) 

     nets = int(line[5:12]) 
     dt = float(line[17:25]) 
     ath = np.array((fdirection, npts, dt)) 

     # For the rest of the lines 
     for line in file: 
      uys = [float(n) for n in line.split()] 
      ath = np.hstack((ath, uys)) 
      if not os.path.isdir(savefpath): 
       os.makedirs(savefpath, exist_ok=True) 
      np.savetxt(savefpath + f[i, 15] + '.txt', ath, fmt='%s') 

Кроме того, если вы не ожидали кого-то внешнее, чтобы удалить savefpath, нет необходимости повторно проверить его существование. Если кто-то делает, удалите его, тогда они будут так же вероятны, если вы его создадите, но прежде чем пытаться писать на него. Здесь есть условие гонки, которое выходит за рамки этого вопроса. Просто проверьте его один раз в верхней части функции и создайте ее там, если необходимо.

Смежные вопросы