天天看點

工作中遇到的問題2:雙層for循環不敵dict

問題1衍生出來的,有一個字段‘update_time’,從小到大排序,10分鐘為一個mark。

之前的做法是,先求得最大時間和最小時間之間有多少個10分鐘,以十分鐘十分鐘的存入一個list,外層周遊‘update_time’,内層用每個time去list裡面比較,取出索引值,具體如下:

df = df.sort_values('update_time', ascending=True)  # 時間升序
    min = (df['update_time'].min())
    max = (((df['update_time'].max()) - (df['update_time'].min())) / 600).astype(int)  # 多少個十分鐘

    '''時間間隔 1 '''
    gap = []
    gap.append(min)
    # gap=[gap[i] + 600 for i in range(0, max + 1)]
    # print(1,gap)
    for i in range(0, max + 1):
        target = gap[i] + 600
        gap.append(target)

    df['mark'] = 1
    k = 0
    for m in df['update_time']:
        for n in gap[k:]:
            if m >= n:
                continue
            else:
                a = df[df['update_time'] == m]['mark'].index
                df['mark'][a] = gap.index(n)
                k = gap.index(n)  # 下一輪從目前位置開始周遊gap[k:]
                break
           

然後,同僚用一個月的資料量去跑,一晚上沒跑出來,我的天.....

然後,逼得他改了方式,用python自帶的字典dict,15分鐘就出來了,哈哈哈

gap = []
    gap.append(min)
    for i in range(0, max + 1):
        target = gap[i] + 600
        gap.append(target)
    dic={}
    dic2={}
    for i in range(len(gap)-1):
        dic[(gap[i],gap[i+1])]=i+1
        dic2[(gap[i]+150,gap[i+1]+150)]=i+1
     
    def f(x,dic):
    for k,v in dic.items():
        if k[0]<=x and x<=k[1]:
            return v
           

就去了解了一下, python dict是一個哈希函數,其最壞的情況是O(n)。應該看一下資料結構。

繼續閱讀