背景是这样的,最近公司在弄机器学习,现在遇到性能瓶颈,老板又急着要结果,刚刚从其他项目撤出的我,就学习了他的代码,当时他们就提出要改善性能了,于是借用了pycharm的分析工具。

首先我们先看一下下面的代码:

def cov_num_2_date(dateNumber):
    dateString = ('%.3f'%dateNumber)
        date = datetime.datetime.strptime(dateString[0:8], '%Y%m%d')
    return date

代码的作用很简单,dateNumber输出是一个float64(比如:2.01511281717e+13),之后两行代码的就是先转成了string,然后转成datetime,此外,这个函数被嵌套在三个大循环里面。

贴上pycharm profile的工具分析结果我们可以看到,在这个cov_num_2_date消耗了很多的时间。

这个处理其实复杂了,('%.3f'%dateNumber) 完全没有必要做的,直接转成float(dateNumber)就可以了,这样就不需要特地去转换还替换成带有单引号的字符。

另外我们都知道做机器学习一般用的都用pandas,数据格式就是dataframe,为了提高效率,同一列的数据必须是同一type,我们其实可以把转换这一步提前,读取数据之后马上做,这样就必须要在循环里面做了,你想想每次循环都要做一次转换,他这个还是N^2 的循环...

最后优化,把这个处理提前了之后,效果还是非常明显的,这个方法的时间消耗下降了很多(285ms->32ms),而提前处理的时间(44ms)虽然分担到前一步,但是总体时间节约了很多。