Ваш код не завершен, что затрудняет предоставление хороших советов, но:
- Внутренний цикл не зависит от внешнего цикла, поэтому вытащите его из внешнего цикла.
- max (nc) является константой после первого цикла, поэтому вытащите его из циклов.
Кроме того, вам нужно знать, насколько медленным является текущий код, и насколько быстрым он должен быть, иначе ваши оптимизации могут быть неуместны.
Все ваши данные разрушены. Может быть, что-то перечислить это будет быстрее:
def startbars(query_name, commodity_name):
assert query_name in INNOVOTABLE_FIELD_NAMES
## TODO: Replace with proper SQL query
query = """ SELECT wbcode, Year, """+query_name+"""
FROM innovotable WHERE commodity='"""+commodity_name+"""' and
"""+query_name+""" != 'NULL' """
rows = cursor.execute(query)
mapYearToWbcodeToField = {}
nc = []
global h_list
h_list = {}
for row in rows:
n = float(row[2])
wbCodeToField = mapYearToWbcodeToField.setdefault(int(row[1]),{})
wbCodeToField[str(row[0])] = n
nc.append(n)
constant = 8.0 / max(nc)
for (an_year,wbCodeToField) in mapYearToWbcodeToField.iteritems():
if an_year < 1961 or an_year > 2031:
continue
for (wbCode,value) in wbCodeToField.iteritems():
if wbCode not in result:
continue
skey = wbCode+str(an_year)
h_list[skey] = constant * value
Или переместить все чеки в первый цикл:
def startbars(query_name, commodity_name):
assert query_name in INNOVOTABLE_FIELD_NAMES
## TODO: Replace with proper SQL query
query = """ SELECT wbcode, Year, """+query_name+"""
FROM innovotable WHERE commodity='"""+commodity_name+"""' and
"""+query_name+""" != 'NULL' """
rows = cursor.execute(query)
data = []
maxField = None
for row in rows:
an_year = int(row[1])
if an_year < 1961 or an_year > 2031:
continue
wbCode = str(row[0])
if wbCode not in result:
continue
n = float(row[2])
data.append((wbCode+str(an_year),n))
if maxField is None or n > maxField:
maxField = n
constant = 8.0 / maxField
global h_list
h_list = {}
for (skey,n) in data:
h_list[skey] = constant * n