2015-07-07 5 views
0

Итак, у меня есть понимание, работающее, но Мне интересно, есть ли более быстрый способ сделать это, чем иметь отдельный цикл для каждого индекса.Python Loop

dR представляет собой целую кучу информации, загружаемой из файла netCDF, а dN готовится к использованию в качестве копии для интерполяции.

dN = { 'lev' : { i : dR['lev'][i] * 3.370079 for i in range(len(dR['lev'])) }, 
     'wdi' : { i : dR['wdi'][i,::,1,1] for i in range(len(dR['tim'])) for o in range(len(dI['lev'])) }, 
     'wsp' : { i : dR['wsp'][i,::,1,1] * 1.94384449 for i in range(len(dR['tim'])) for o in range(len(dI['lev'])) }, 
     'u'  : { i : dR['u'][i,::,1,1] * 1.94384449 for i in range(len(dR['tim'])) for o in range(len(dI['lev'])) }, 
     'v'  : { i : dR['v'][i,::,1,1] * 1.94384449 for i in range(len(dR['tim'])) for o in range(len(dI['lev'])) }, 
     'tim' : dR['tim'][::3], 
     'lon' : dR['lon'][::].tolist(), 
     'lat' : dR['lat'][::].tolist()} 

EDIT: Так что я положил кучу индексов вместе в цикле, как так:

dN = { 'lev' : dR['lev'][::] * 3.370079, 
     'wdi' : {}, 
     'wsp' : {}, 
     'u'  : {}, 
     'v'  : {}, 
     'tim' : dR['tim'][::3], 
     'lon' : dR['lon'][::].tolist(), 
     'lat' : dR['lat'][::].tolist()} 

for i in range(len(dN['tim'])): 
    dN['lev'][i] = dR['lev'][i,::,1,1] * 3.370079 
    for o in range(len(dI['lev'])): 
     dN['wsp'][i] = dR['wsp'][i,::,1,1] * 1.94384449 
     dN['wdi'][i] = dR['wdi'][i,::,1,1] * 1.94384449 
     dN['u'][i] = dR['u'][i,::,1,1] * 1.94384449 
     dN['v'][i] = dR['v'][i,::,1,1] * 1.94384449 

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

+0

Каков ваш ожидаемый результат? –

+0

Я получаю ожидаемый результат, я просто хочу знать, есть ли более быстрый способ делать то, что я делаю. – vcxo

+0

Итак, мы должны сказать вам, как получить от ввода, который мы не знаем, к результату, который мы не знаем быстрее? –

ответ

0

Я вижу из вашего кода, что dN ['wsp'], dN ['u'] и dN ['v'] точно такие же. Очевидным улучшением является создание этого словаря один раз и его копирование (или глубокая копия, если это имеет больше смысла для приложения). Но это не имеет никакого отношения к тому, как работают подходы, это просто хорошая техника программирования. Вы пытаетесь задать более целенаправленный вопрос?

Я также считаю, что наличие понятий в словаре в словаре длинного словаря декларации трудно читать.

+0

Привет, извините, если мой первоначальный вопрос казался немного расплывчатым, я попытаюсь повторить. 'dR = {i: {o для o в диапазоне (0, 5)} для i в диапазоне (0, 5)}' Так что я делаю это для нескольких индексов в словаре, и мне интересно, theres более быстрый способ сделать это, чем иметь 4 отдельных цикла. Я хочу свести к минимуму строки кода, поэтому я предпочел бы сделать все это в начальной настройке словаря. – vcxo

+0

Ваш вопрос был достаточно ясным. Но что вы хотите, самый быстрый путь или самый короткий путь? Если вы хотите быстрее, вы действительно думаете, что выполнение одного и того же цикла несколько раз может быть правильным? И почему бы вы никогда не хотели минимизировать количество строк - как это может быть целью в любой задаче программирования? Вы платите за линию, чтобы кто-то другой написал ее для вас? –

0

Вы используете:

dR[someindex][i,::,1,1] * somefactor for i in range(len(dR['tim'])) for o in range(len(dI['lev'])) 

Где somefactor либо 1 или 1,94384449

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