DataFrame和Series赋值的性能
结论
DataFrame最好直接进行重构赋值新变量,而不做修改删除等操作。因为两者量级一旦起来存在极大时间差异。
背景
工作场景中,生产环境的linux系统 与 本地windows对比,发现有时间方面差异。本身0.3s能在windows匹配出来的数据,在linux中却1s匹配。
那么,在生产环境的服务器性能优于自己电脑,却产生这样子情况,故进行问题查找。
时间装饰器
首先排查问题是需要找到每一个函数所使用的时间,但是每次都写
import time
start = time.time()
df(xxx)
print("耗费时间是:{}".format(time.time()-start))
会十分浪费空间大小,所以可以用装饰器解决。
# 装饰器
def ctime(func):
def warpper(*arsg, **kwargs):
start_time = time.time()
res = func(*arsg, **kwargs)
end_time = time.time()
print("%s cost %ss" % (func.__name__, end_time - start_time))
return res
return warpper
用法是
import time
@ctime
df(xxx)
查找时间分布
1、找到耗时函数
利用装饰器找到一个函数的耗时,两者差异较大,如果在linux耗时0.4s,在windows只需0.03s-0.10s(pycharm有编译器,用pycharm 0.03s,但是python xxx.py时却0.10s)
2、分析哪一步耗时慢
函数内部使用的就是一个个表达式,无法使用装饰器,那么只能够
start = time.time()
df_tmp['num_get'] = df_tmp.apply(lambda x: self.interval_treat(str(x['info_match'])), axis=1)
print('1-------{}'.format(time.time()-start))
df_tmp['num_one'], df_tmp['num_two'] = df_tmp['num_get'].str.split('plus').str
print('2-------{}'.format(time