2024-06-14 01:28:21 发布
网友
只是学习python并开始研究嵌套/工厂函数(简单示例):
def maker(N): def action(X): return X * N return action
与创建类相比,工厂函数有什么优势吗?表演?记忆?清理?
我最喜欢嵌套函数的地方是它比类更不冗长。maker函数的等价类定义是:
class clsmaker(object): def __init__(self, N): self.N = N def __call__(self, X): return X * self.N
在开始向构造函数中添加更多参数之前,这看起来并不是很糟糕。然后以类的方式对每个参数使用一个额外的行,而函数只获取额外的参数。
事实证明,嵌套函数还有一个速度优势:
>>> T1 = timeit.Timer('maker(3)(4)', 'from __main__ import maker') >>> T1.timeit() 1.2818338871002197 >>> T2 = timeit.Timer('clsmaker(3)(4)', 'from __main__ import clsmaker') >>> T2.timeit() 2.2137160301208496
这可能是因为嵌套函数版本中涉及的操作码较少:
>>> dis(clsmaker.__call__) 5 0 LOAD_FAST 1 (X) 3 LOAD_FAST 0 (self) 6 LOAD_ATTR 0 (N) 9 BINARY_MULTIPLY 10 RETURN_VALUE >>> act = maker(3) >>> dis(act) 3 0 LOAD_FAST 0 (X) 3 LOAD_DEREF 0 (N) 6 BINARY_MULTIPLY 7 RETURN_VALUE
将函数工厂与类进行比较就是比较苹果和桔子。如果有数据和函数的内聚集合(一起称为对象),请使用类。如果需要函数,并希望参数化其创建,请使用函数工厂。
这两种技术的选择应该取决于代码的含义。
嵌套函数允许动态创建自定义函数。
看看例如decorators。生成的函数依赖于在创建时绑定的变量,这些变量在创建后不需要更改。因此,为此目的使用一个类将使变得不那么有意义。
我最喜欢嵌套函数的地方是它比类更不冗长。maker函数的等价类定义是:
在开始向构造函数中添加更多参数之前,这看起来并不是很糟糕。然后以类的方式对每个参数使用一个额外的行,而函数只获取额外的参数。
事实证明,嵌套函数还有一个速度优势:
这可能是因为嵌套函数版本中涉及的操作码较少:
将函数工厂与类进行比较就是比较苹果和桔子。如果有数据和函数的内聚集合(一起称为对象),请使用类。如果需要函数,并希望参数化其创建,请使用函数工厂。
这两种技术的选择应该取决于代码的含义。
嵌套函数允许动态创建自定义函数。
看看例如decorators。生成的函数依赖于在创建时绑定的变量,这些变量在创建后不需要更改。因此,为此目的使用一个类将使变得不那么有意义。
相关问题 更多 >
编程相关推荐