如何定义常量函数

时间:2013-03-08 11:14:42

标签: python

在我找到的documentation

  

总是返回零的函数int()只是一个特例   不变的功能。一种更快,更灵活的创建常量的方法   函数是使用itertools.repeat(),它可以提供任何常量   价值(不只是零):

def constant_factory(value): 
   return itertools.repeat(value).next

d = defaultdict(constant_factory('<missing>'))
d.update(name='John', action='ran')
'%(name)s %(action)s to %(object)s' % d 

'John ran to <missing>'

为什么不简单地使用lambda函数来获得常量函数?

1 个答案:

答案 0 :(得分:3)

itertools.repeat类是用C语言编写的,它比使用Python编写的函数快一点。以下是使用timeit模块对不同的常量值函数实现进行的一些测试:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17)
[MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> import itertools
>>> itertools_version = itertools.repeat(10).__next__
>>> lambda_version = lambda:10
>>> def function_version():
    return 10
>>> def constant_factory(n):
    return itertools.repeat(n).__next__
>>> factory_version = constant_factory(10)
>>> timeit.timeit("for i in range(100): f()",
                  setup="from __main__ import itertools_version as f")
7.115707915662512
>>> timeit.timeit("for i in range(100): f()",
                  setup="from __main__ import lambda_version as f")
11.479014911317307
>>> timeit.timeit("for i in range(100): f()",
                  setup="from __main__ import function_version as f")
11.561433023257619
>>> timeit.timeit("for i in range(100): f()",
                  setup="from __main__ import factory_version as f")
7.166709032038568

但是,请仔细考虑这种适度的性能提升是否适合您的情况。如果这不是性能关键代码,那么在以后阅读时,您应该使用您认为最容易理解的实现。

如果你只想使用常数函数一次,我认为lambda是完全合适的。如果它是你经常使用的东西,那么命名函数可能更好。如果在一些最时间敏感的逻辑的内部循环中调用它,那么使用itertools.repeat对象的绑定方法。