2014-06-20 4 views
0

Я пытаюсь оптимизировать скрипт python, который проходит через цикл 459*458*23 раз.Оптимизация списков и чтения csv python

В настоящее время сценарий занимает около 2 дней.

Вот сценарий:

for i in range(0, len(file_names)): 
     for q in range(0, len(original_tuples)): 
      for j in range(0, len(original_tuples)): 
       cur_freq = int(original_tuples[j][0]) 
       cur_clamp = int(original_tuples[j][1]) 
       freq_num = int(raw_tuples[j][0]) 
       clamp_num = int(raw_tuples[j][1]) 
       perf = str(cur_freq) + "/" + str(cur_freq)+ "-" + str(cur_clamp) + "/" + file_names[i] + "-perf.csv" 
       power = str(cur_freq) + "/" + str(cur_freq)+ "-" + str(cur_clamp) + "/" + file_names[i] + "-power.csv" 
       dataset = r_script.parse_files(perf,power) 
       a, b,c,d,e,f,g,h,i = r_script.avg(dataset) 
       s = freq_logs[freq_num][0]%(a,b,c,d,h,e,g,f) 
       index = s.find('=')+1 
       predicted = float(eval(s[index:])) 
       switching_power[i][q][freq_num][clamp_num].append(float(predicted)) 
       real_power[i][freq_num][clamp_num].append(float(i)) 

       for k in range(0, len(possible_frequency)): 
        if int(possible_frequency[k]) != int(cur_freq): 
         temp_freq = int(possible_frequency[k]) 
         temp_clamp = clamp_num 
         temp_freq_num = possible_frequency.index(possible_frequency[k]) 
         perf1 = str(temp_freq) + "/" + str(temp_freq)+ "-" + str(temp_clamp) + "/" + file_names[i] + "-perf.csv" 
         power1 = str(temp_freq) + "/" + str(temp_freq)+ "-" + str(temp_clamp) + "/" + file_names[i] + "-power.csv" 
         dataset1 = r_script.parse_files(perf1,power1) 
         a1, b1,c1,d1,e1,f1,g1,h1,i1 = r_script.avg(dataset1) 
         s = freq_logs[temp_freq_num][0]%(a,b,c,d,h,e,g,f) 
         index = s.find('=')+1 
         predicted = float(eval(s[index:])) 
         switching_power[i][q][temp_freq_num][temp_clamp].append(float(predicted)) 

       for l in range(0, len(possible_frequency)): 
        for m in range(0, len(clamp_range)): 
         if int(clamp_range[m]) != int(cur_clamp): 
          cl_temp_freq = int(possible_frequency[l]) 
          cl_temp_clamp = int(clamp_range[m]) 
          cl_temp_freq_num = int(possible_frequency.index(possible_frequency[l])) 
          cl_temp_clamp_num = int(clamp_range.index(clamp_range[m])) 
          if (cl_temp_clamp_num != cl_temp_clamp): 
           sys.exit("buggy...clamp # not matching") 

          perf2 = str(cl_temp_freq) + "/" + str(cl_temp_freq)+ "-" + str(cl_temp_clamp) + "/" + file_names[i] + "-perf.csv" 
          power2 = str(cl_temp_freq) + "/" + str(cl_temp_freq)+ "-" + str(cl_temp_clamp) + "/" + file_names[i] + "-power.csv" 
          dataset2 = r_script.parse_files(perf2,power2) 
          a2, b2,c2,d2,e2,f2,g2,h2,i2 = r_script.avg(dataset2) 
          previous_predicted_power = switching_power[i][q][cl_temp_freq_num][temp_clamp][0] 
          clamper = float(temp_clamp)/float(cl_temp_clamp_num) 
          s = clamp_logs[temp_freq_num][0]%(previous_predicted_power, clamper) 
          index = s.find('=')+1 
          predicted = float(eval(s[index:])) 
          switching_power[i][q][temp_freq_num][temp_clamp].append(float(predicted)) 

    for n in range(0, len(file_names)): 
     for fo in range(0, len(original_tuples)): 
      for o in range(0, len(original_tuples)): 
       freq_num = int(raw_tuples[o][0]) 
       clamp_num = int(raw_tuples[o][1]) 
       diff_power[n][fo][freq_num][clamp_num] = float(float(real_power[n][freq_num][clamp_num][0])-float(switching_power[n][fo][freq_num][clamp_num][0])) 

Вот списки:

possible_clamp_levels = int(len(clamp_range)*len(possible_frequency)) 
original_tuples = [] 
raw_tuples = [] 
switching_power = [[[[[] for d in range(0, len(clamp_range))] for c in range(0, len(possible_frequency))] for b in range(0, possible_clamp_levels)] for a in range(0, len(file_names))] 
diff_power = [[[[[] for d in range(0, len(clamp_range))] for c in range(0, len(possible_frequency))] for b in range(0, possible_clamp_levels)] for a in range(0, len(file_names))] 
real_power = [[[[] for d in range(0, len(clamp_range))]for c in range(0, len(possible_frequency))] for a in range(0, len(file_names))] 

for a in range(0, len(possible_frequency)): 
    for b in range(0, len(clamp_range)): 
     test = (possible_frequency[a], clamp_range[b]) 
     test1 = (a,b) 
     original_tuples.append(test) 
     raw_tuples.append(test1) 

Позвольте мне знать, если вам нужны какие-либо указатели о самом сценарии, чтобы помочь мне оптимизировать его. Freq_logs и clamp_logs являются в основном линейными заменами уравнений. r_script - это еще один скрипт, который считывает эти файлы csv. для этого требуется меньше 10ms.

+1

Профилируйте свой код и посмотрите, где он проводит большую часть своего времени. – martineau

+2

Но прежде, чем вы его профайл - отредактируйте свой код. Одним из моих любимых «правил» в рефакторинге является принцип SRP (принцип единой ответственности): это означает, что каждая функция должна делать только одно и только одно. Другое эмпирическое правило говорит о том, что функция в выразительном языке, таком как python, должна быть <10 строк кода – alfasin

+1

Этот вопрос кажется вне темы, поскольку он касается улучшения рабочего кода. Это лучше подходит для codereview.stackexchange.com –

ответ

0

Turn итерации с использованием индекса в реальную итерацию над Iterable изменения

for i in range(len(lst): 
    item = lst[i] 
    print item #do something useful here 

в

for itm in lst: 
    print itm # do something useful here 

В случае, если вам действительно нужно знать индекс в настоящее время обрабатываемого элемента, используйте enumerate

for i, itm in enumerate(lst): 
    print itm # do something useful here 

Ваш код будет выглядеть гораздо больше вещий (и вы могли бы получить немного скорости)

Разделяй и властвуй - MultiProcessing

Если вы можете перепроектировать решения, вы можете, например, обрабатывать данные в нескольких группах и, наконец, объединять результаты. Это предполагает:

  • можно разделить работу на части и объединять результаты позже
  • I/O не ограничение (если вы ограничены чтение с одного диска, карты - уменьшить подход не будет быстрота вещей.)
Смежные вопросы