Translate

2016年7月26日 星期二

【自己的壞習慣】能在一個迴圈裡面解決,就不要用兩個-Python

【自己的壞習慣】能在一個迴圈裡面解決,就不要用兩個-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)

嗯…這樣算下來,我自己也是對於程式寫法所造成的效能差距,有一點點的小進步了。





沒有留言:

張貼留言