問題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)。應該看一下資料結構。