对于程序中算法的小感想

估摸着程序还得跑个半小时,顺手写写今天碰到一件小事的感想。

一组DataFrame数据,columns有 [index, user_id, time_stamp],index无重复,user_id有重复,time_stamp是用户某一行为的时间戳且无序。

我要做一件事:计算同用户此刻时间戳与之前最近的时间戳之差,第一次行为时间戳直接记为-1。

比如:

index, user_id, time_stamp, time_diff

0, yanwu, 100, -1

1, yanwu , 130, 10

2, yanwu, 120, 20

因为time_stamp = 100的是最小的,意味着是第一次行为时间戳,标记为-1;

而下个最近的time_stamp  = 120,而120-100=20,所以差值为20;

同理130的这一行差值为130-120=10。

好,现在打算怎么做?



我第一个做法是这样:

两个for循环,第一个for里面找user_id,第二个for里面给user_id计算差值:

for i in set([user_id]):

      sort(i.[time_stamp]) //给i用户的时间戳排序

      for j in range(len(i.[time_stamp])):

                if j == 0:

                    time_diff = -1 //第一个的差值设置为-1

              else:

                      time_diff = i.[time_stamp][i] - i.[time_stamp] [i-1] //其余的差值就当前的减去上一个

很好理解吧,但是这个程序跑了我10小时... ... 因为我原数据接近100w条... ...

这么写,无非就是把我最真实的想法表现了出来,差值就是同一用户里时间戳两两相减,但是造成的结果呢?耗时耗力,强行用双重for遍历了这100w的数据。况且DataFrame中一条条遍历,已经蠢得不行了,这时候就必须考虑重新设计算法。是啊,跑了10小时才想起来修改算法... ... 真是血的教训... ...



我的第二个做法跑了不到1分钟,是这样的:

我最耗时间的是什么操作?遍历。

遍历是为了什么?给每一条数据做减法。

那能不能一次就减完呢?当然行啊。

首先我们确定一个东西,每一条数据该去减哪一条数据都是确定了的,已经有了确定的规则:“同一用户,上一条”。

sort_values(by=['user_id', 'time_tamp']) //通过user_id和timestamp为关键词排序

[tmp] =  ['time_tamp'][-1:].append([' time_tamp'][0:-1])  //创建一个新的数组型数据,内容按序设为time_stamp的倒数第一条加上前面所有条

[time_diff] = ['time_tamp'] - [tmp] //所有差值等于原时间戳列对应减去tmp

....... //最后通过groupby+rank找到每个user_id的第一条数据,将time_diff变为-1就是

看懂了吗?最核心的就第一个按两个关键字的排序,直接把确定的规则:“同一用户,上一条”给体现了出来。

按用户排序就直接把同一用户分在了一起,而给time_stamp排序则直接告诉我,减数与被减数,就是两两相邻的两条数据。

所以我直接减数这一列,也就是 ['time_tamp']不变,而被减数这一列数据就是减数['time_tamp']整体下移一条,然后两列数据对应相减,齐活,哪来什么遍历什么循环等等乱七八糟的,还10个小时呢.... ...



这只是个日常编程中的一个小插曲,但是给我感触挺深的,少用for循环 虽然代码是表达人的思维,但是在表达思维的同时也要刻意注意算法的设计,毕竟算法是编程中很重要的一环,需要时刻注意去打磨去锻炼,否则... ... 否则... ... 否则... ... 哎,反正算法很重要!


(文章中的代码实属乱写,只是表达个基本意思;另外文章内容欢迎批评指正。)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容