工作中遇到的问题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)。应该看一下数据结构。

猜你喜欢

转载自blog.csdn.net/sisteryaya/article/details/79471087