python - python timer decorator - 函数对我放入参数的原始数据集生效
问题描述
我对 python 装饰器比较陌生。
我有这个装饰器功能。
def myTimer(func):
def wrapper(*args, **kargs):
t1 = time.time()
result = func(*args, **kargs)
t2 = time.time() - t1
print('Execution Time (function : {}) : {} sec'.format(func.__name__, t2))
return result
return wrapper
这只是一个定时器功能。而且,我有一种方法可以根据另一列添加一列。
@myTimer
def createID(dat):
dat['new'] = dat.apply(lambda x: '_'.join(map(str, x[4:8])), axis = 1)
return dat
这会生成一个新列,其值只是由“_”分隔符组合的另一列值。
现在,如果我定义上面的两个函数并在下面运行,
tdat2 = createID(tdat)
然后 tdat2 正确返回,但更改也对 tdat(原始数据集)生效。我的意思是,tdat 首先有 30 列,而 tdat2 应该有 31 列,这很好,但 tdat 也有新列。
有什么办法可以解决这个问题吗?我在下面尝试过,它对我来说很好,但是由于代码约定等原因,我希望参数和返回值相同('dat')。
@myTimer
def createID2(dat):
result = dat.copy()
result['new'] = result.apply(lambda x: '_'.join(map(str, x[4:8])), axis = 1)
return result
提前致谢。
解决方案
一些笔记
- 由于您没有类,
createID
因此称为函数。它是一个黑盒子:它接受输入,做某事并返回输出。在 Python 中,函数用小写字母和下划线编写,例如create_id
. my_timer()
也是一个包装了它所装饰的函数的函数,即create_id()
. 除了打印一些东西(副作用)之外,您的装饰器实际上不会对您的包装函数做任何事情。
因此,装饰函数内部发生的任何事情都不受装饰器的影响。它所做的只是计算函数调用运行的速度。
您描述的突变问题是熊猫问题(请参阅View vs Copy文档)。你已经用.copy()
方法解决了。
推荐阅读
- c# - C# MongoDB 使用 Pusheach 将数组添加到数组中,并结合位置标识符始终位于位置 0
- python - GCP 中的 AWS Batch 模拟?
- c# - 如何获取列表中特定星期几的日期数
? - angular - 在大屏幕上隐藏 sidenav
- python - 现在烧瓶中的 session.modified = True 是多余的吗?
- angular - 用 Ionic 编写 JSON 文件
- ios - iOS 崩溃:-[UITextView(LinkInteraction) startInteractionWithLinkAtPoint:]
- php - Laravel 我的发布方法(商店)表单不起作用
- node.js - 进行异步调用的 Mocha 测试同步功能
- python - 格式化我正在构建的这个 Python 员工程序的输出