最佳化兩個簡單的巢狀迴圈
1、問題背景
在最佳化以下兩個巢狀迴圈時遇到了一些困難:
def startbars( query_name, commodity_name):
global h_list
nc, s, h_list = [], {}, {}
query = """ SELECT wbcode, Year, """ + query_name + """
FROM innovotable WHERE commodity='""" + commodity_name + """' and
""" + query_name + """ != 'NULL' """
rows = cursor. execute( query)
for row in rows:
n = float( row[ 2])
s[ str( row[ 0]) + str( row[ 1])] = n
nc. append( n)
for iso in result:
try:
for an_year in xrange( 1961, 2031, 1):
skey = iso + str( an_year)
h_list[ skey] = 8.0 / max( nc) * s[ skey]
except:
pass
希望找到一些最佳化思路來提高程式碼效率。
2、解決方案
最佳化建議:
-
將內部迴圈從外部迴圈中分離出來。因為內部迴圈並不依賴於外部迴圈,因此可以將其提取出來,這將簡化程式碼結構並提高效率。
-
將
max(nc)
移出迴圈。max(nc)
在第一次迴圈後就是一個常量,因此可以將其移出迴圈以減少重複計算。 -
重新組織資料結構。最佳化後的程式碼使用了一個字典
mapYearToWbcodeToField
來儲存資料,這使得查詢更加高效。同時使用了一個列表nc
來儲存所有值的最大值,這樣就可以在一次迴圈中計算出constant
。
以下是最佳化後的程式碼:
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
在這個示例中,原始的巢狀迴圈遍歷了二維陣列中的所有元素,並將每個元素乘以2後新增到結果列表中。最佳化後的版本避免了使用
range(len(data))
和
range(len(data[i]))
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3012524/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Sql 巢狀迴圈最佳化案例SQL巢狀
- 迴圈_巢狀巢狀
- 兩表連線一:巢狀迴圈連線巢狀
- Python 迴圈巢狀Python巢狀
- 巢狀迴圈成本消耗巢狀
- python怎麼迴圈巢狀Python巢狀
- python 跳出巢狀迴圈方法Python巢狀
- MySQL Join原理分析(緩衝塊巢狀與索引巢狀迴圈)MySql巢狀索引
- Python的if else 巢狀 和forin while 迴圈Python巢狀While
- 記錄一次 postgresql 最佳化案例( 巢狀迴圈改HASH JOIN )SQL巢狀
- thinkphp中volist的多重迴圈,標籤巢狀PHP巢狀
- while + else 使用,while死迴圈與while的巢狀,for迴圈基本使用,range關鍵字,for的迴圈補充(break、continue、else) ,for迴圈的巢狀,基本資料型別及內建方法While巢狀資料型別
- python 利用 for ... else 跳出雙層巢狀迴圈Python巢狀
- Linux Shell程式設計(17)——巢狀迴圈Linux程式設計巢狀
- UpdatePanel的簡單用法(非巢狀)巢狀
- 迴圈中巢狀非同步操作的流程控制巢狀非同步
- Oracle的表連線方法(二)巢狀迴圈連線Oracle巢狀
- 關於迴圈巢狀nested loops的一點分析巢狀OOP
- ViewPager巢狀fragment簡單使用Viewpager巢狀Fragment
- java中如何將巢狀迴圈效能提高500倍Java巢狀
- 瞭解巢狀迴圈聯接、合併聯接巢狀
- sql使用cursor寫一個簡單的迴圈<轉>SQL
- 巢狀類遞迴巢狀遞迴
- python基礎語法迴圈巢狀和列表(一)Python巢狀
- python基礎語法迴圈巢狀和列表(二)Python巢狀
- 微課sql最佳化(14)、表的連線方法(3)-關於Nested Loops Join(巢狀迴圈)SQLOOP巢狀
- 高效遍歷匹配Json資料,避免巢狀迴圈[轉]JSON巢狀
- C++ 巢狀類簡單測試C++巢狀
- 迴圈雙連結串列的簡單操作
- 簡單的 for 迴圈也會踩的坑
- 對比SQL中簡單巢狀查詢與非巢狀查詢CFSQL巢狀
- Java簡單迴圈語句案例Java
- parallel: 一個簡單的並行執行Go迴圈的庫Parallel並行Go
- 簡單理解Java中的4種迴圈Java
- 碎片化學習Java(二十)Java for迴圈巢狀輸出指定圖案Java巢狀
- 一個簡易的渲染迴圈結構
- 16進位制的簡單運算(迴圈)
- js迴圈中reduce的用法簡單介紹JS