Python functools部分效率

发布于 2021-01-29 17:46:05

我一直在使用Python,并且设置了以下代码情况:

import timeit

setting = """
import functools

def f(a,b,c):
    pass

g = functools.partial(f,c=3)    
h = functools.partial(f,b=5,c=3)   
i = functools.partial(f,a=4,b=5,c=3)
"""

print timeit.timeit('f(4,5,3)', setup = setting, number=100000)
print timeit.timeit('g(4,5)', setup = setting, number=100000)
print timeit.timeit('h(4)', setup = setting, number=100000)
print timeit.timeit('i()', setup = setting, number=100000)

结果如下:

f: 0.181384086609
g: 0.39066195488
h: 0.425783157349
i: 0.391901016235

为什么调用部分函数需要更长的时间?局部函数只是将参数转发到原始函数还是在整个过程中映射静态参数?而且,在所有参数都已预定义的情况下,Python中是否有一个函数可以返回填充的函数主体,例如函数i?

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    为什么调用部分函数需要更长的时间?

    partial由于附加的函数调用,的代码花费的时间大约是原来的两倍。函数调用很昂贵:

    Python中的函数调用开销相对较高,尤其是与内置函数的执行速度相比。

    --

    局部函数只是将参数转发到原始函数还是在整个过程中映射静态参数?

    据我所知-
    是的,它只是将参数转发给原始函数

    --

    而且,在所有参数都已预定义的情况下,Python中是否有一个函数可以返回填充的函数主体,例如函数i?

    不,我不了解Python中的此类内置函数。但是我认为可以做您想做的事情,因为函数是可以复制和修改的对象。

    这是一个原型:

    import timeit
    import types
    
    
    # http://stackoverflow.com/questions/6527633/how-can-i-make-a-deepcopy-of-a-function-in-python
    def copy_func(f, name=None):
        return types.FunctionType(f.func_code, f.func_globals, name or f.func_name,
            f.func_defaults, f.func_closure)
    
    
    def f(a, b, c):
        return a + b + c
    
    
    i = copy_func(f, 'i')
    i.func_defaults = (4, 5, 3)
    
    
    print timeit.timeit('f(4,5,3)', setup = 'from __main__ import f', number=100000)
    print timeit.timeit('i()', setup = 'from __main__ import i', number=100000)
    

    这使:

    0.0257439613342
    0.0221881866455
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看