Я пытаюсь оптимизировать скрипт 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
.
Профилируйте свой код и посмотрите, где он проводит большую часть своего времени. – martineau
Но прежде, чем вы его профайл - отредактируйте свой код. Одним из моих любимых «правил» в рефакторинге является принцип SRP (принцип единой ответственности): это означает, что каждая функция должна делать только одно и только одно. Другое эмпирическое правило говорит о том, что функция в выразительном языке, таком как python, должна быть <10 строк кода – alfasin
Этот вопрос кажется вне темы, поскольку он касается улучшения рабочего кода. Это лучше подходит для codereview.stackexchange.com –