【自己的壞習慣】能在一個迴圈裡面解決,就不要用兩個-Python
在我剛開始學著怎麼寫程式的時候,沒辦法一個步驟就把我想要的動作寫出來。
所以,一個迴圈沒辦法把我的想法做出的時候,該怎麼辦?
這時候,可以借鏡某個政治人物說的話
「一個便當不夠,你有試過吃兩個嗎?」
對!
就是用比較多的步驟組合,組合出我想要的東西。
一個迴圈我做不出來,那就先處理一步驟,然後我再用另一個迴圈去跑剩下的步驟,有時候二個做不出來,我還會再加上第三、四個。
用膝蓋想,我也知道這樣的效能會很差。
那….膝蓋想不出來的部分,就是「差多少?」
大家都知道會比較差,可是我想要知道的是,差多少?
所以,以下,就用兩萬個csv檔來做試範。
這兩萬個csv檔是台灣某個城市的停車場資料,大約是兩個月左右的份量。
因為我有興趣的是周末的資料,但未來也有可能要分析周間的資料。
程式的流程大概是這樣
跑兩個迴圈的程式,大概是這樣
A>
掃過目標資料夾,把所有的檔名存入 list
B>
再掃剛剛的list中分出 weekendList和 weekdayList
只用一個迴圈的程式。
A> 掃過目標資料,直接用 if, elif,
else 判斷是不是
周末,如果是周末,就直接存入 weekendList,不是周末,就存入 weekdayList.
時間的差距 兩個迴圈:5秒左右 一個迴圈:0.5秒左右
以下是用兩個迴圈的程式碼 run time = 5 sec
for name in os.listdir(file_path): """ 掃過所有 file_path 內的檔名. 把時間從 str轉成 datetime後,存入dateTimeL 然後把檔案位置存入 history_list """ timeIn = name[:-4].replace("_", "T") timeIn = insertColon(timeIn, -4) timeIn = insertColon(timeIn, -2) obj = datetime.datetime.strptime(timeIn,'%Y-%m-%dT%H:%M:%S') dateTimeL.append(obj) #obj 是轉換成 datetime後的東西 #print(obj.isoweekday()) justName.append(timeIn) #這一步,只抓了名字的檔案,以後可能有用 name = file_path + name history_list.append(name) #print(dateTimeL[1000].isoweekday()) for each in dateTimeL: fileIn = dateTimeL.index(each) if each.isoweekday() == 6: weekEndNL.append(each) weekEndFL.append(history_list[fileIn]) elif each.isoweekday() == 7: weekEndNL.append(each) weekEndFL.append(history_list[fileIn]) else: weekDayNL.append(each) weekDayFL.append(history_list[fileIn])
以下是用一個迴圈的程式碼 run time = 0.5 sec
for name in os.listdir(file_path): """ 掃過所有 file_path 內的檔名. 把時間從 str轉成 datetime後,存入dateTimeL 然後把檔案位置存入 history_list """ timeIn = name[:-4].replace("_", "T") timeIn = insertColon(timeIn, -4) timeIn = insertColon(timeIn, -2) obj = datetime.datetime.strptime(timeIn,'%Y-%m-%dT%H:%M:%S') dateTimeL.append(obj) #obj 是轉換成 datetime後的東西 #print(obj.isoweekday()) """ 用 date.isoweekday() 判斷是否 Sat, Sun 如果是,則把他放到 weekEnd 否, 則放到 weekDay """ if obj.isoweekday() == 6: weekEndFL.append(file_path + name) weekEndNL.append(obj) elif obj.isoweekday() == 7: weekEndFL.append(file_path + name) weekEndNL.append(obj) else: weekDayFL.append(file_path + name) weekDayNL.append(obj) justName.append(timeIn) #這一步,只抓了名字的檔案,以後可能有用 name = file_path + name history_list.append(name)
嗯…這樣算下來,我自己也是對於程式寫法所造成的效能差距,有一點點的小進步了。
沒有留言:
張貼留言