あなたのコードは完全ではないため、適切なアドバイスをすることは困難ですが:
- 内側のループは外側のループに依存しないため、外側のループから引き出します。
- 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