最佳化兩個簡單的巢狀迴圈
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python怎麼迴圈巢狀Python巢狀
- Python的if else 巢狀 和forin while 迴圈Python巢狀While
- MySQL Join原理分析(緩衝塊巢狀與索引巢狀迴圈)MySql巢狀索引
- 記錄一次 postgresql 最佳化案例( 巢狀迴圈改HASH JOIN )SQL巢狀
- python 利用 for ... else 跳出雙層巢狀迴圈Python巢狀
- while + else 使用,while死迴圈與while的巢狀,for迴圈基本使用,range關鍵字,for的迴圈補充(break、continue、else) ,for迴圈的巢狀,基本資料型別及內建方法While巢狀資料型別
- ViewPager巢狀fragment簡單使用Viewpager巢狀Fragment
- 迴圈中巢狀非同步操作的流程控制巢狀非同步
- python基礎語法迴圈巢狀和列表(一)Python巢狀
- python基礎語法迴圈巢狀和列表(二)Python巢狀
- java中如何將巢狀迴圈效能提高500倍Java巢狀
- 微課sql最佳化(14)、表的連線方法(3)-關於Nested Loops Join(巢狀迴圈)SQLOOP巢狀
- 巢狀類遞迴巢狀遞迴
- 高效遍歷匹配Json資料,避免巢狀迴圈[轉]JSON巢狀
- C++ 巢狀類簡單測試C++巢狀
- 對比SQL中簡單巢狀查詢與非巢狀查詢CFSQL巢狀
- 簡單的 for 迴圈也會踩的坑
- parallel: 一個簡單的並行執行Go迴圈的庫Parallel並行Go
- Java簡單迴圈語句案例Java
- 簡單的for迴圈有什麼新玩法
- 簡單理解Java中的4種迴圈Java
- 碎片化學習Java(二十)Java for迴圈巢狀輸出指定圖案Java巢狀
- Vue案例引發的「巢狀元件」通訊的簡單方式Vue巢狀元件
- 16進位制的簡單運算(迴圈)
- js迴圈中reduce的用法簡單介紹JS
- [work] python巢狀字典的遞迴遍歷Python巢狀遞迴
- 一個簡易的渲染迴圈結構
- Python 工匠:編寫地道迴圈的兩個建議Python
- 探討兩種迴圈表示方法的區別,while迴圈與for迴圈的小總結While
- 【TUNE_ORACLE】列出返回行數較多的巢狀迴圈(NESTED LOOPS)SQL的SQL參考Oracle巢狀OOPSQL
- 巢狀關聯會查詢兩次巢狀
- 將if-else之類巢狀迴圈重構為函式式管道 - XP123巢狀函式
- Python簡單函式迴圈綜合例項Python函式
- element-ui的----el-form表單校驗巢狀表單校驗(表單多層巢狀)+el-table和el-form巢狀使用表單校驗UIORM巢狀
- 1kb的前端HTML模板解析引擎,不限於巢狀、迴圈、函式你能想到的解析方式前端HTML巢狀函式
- 簡單介紹Lua中三種迴圈語句的使用
- node事件迴圈和訊息佇列簡單分析事件佇列
- C++ 只能指標迴圈引用簡單測試C++指標