当前位置: 首页 > 面试题库 >

Python functools部分效率

壤驷承
2023-03-14
问题内容

我一直在使用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?


问题答案:

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

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


 类似资料:
  • 当我尝试执行以下操作时,我得到了一个错误 错误stacktrace- 由:com.datastax.driver.core.exceptions.invalidQueryException:在com.datastax.driver.core.responction$error.asexception(response.java:103)在com.datastax.driver.core.defau

  • 本文向大家介绍bootstrap 设置checkbox部分选中效果,包括了bootstrap 设置checkbox部分选中效果的使用技巧和注意事项,需要的朋友参考一下 在很多页面都会需要根据加载的数据来控制checkbox是否选中,以前的方法在这个UI里并不适用,现贴下两种代码供大家参考。 前提条件:该字段在数据库中是以“,”间隔的字符串,如:“WIFI,电视,有线宽带” 第一种:普通checkb

  • 问题内容: 最近我收到以下错误: 致命异常:NSInternalInconsistencyException无效更新:部分0中的项目数无效。更新(13)之后现有部分中包含的项目数必须等于更新(12)前该部分中包含的项目数,再加上或减去从该部分插入或删除的项目数(插入0,删除0),再加上或减去从该部分移入或移出的项目数(移入0,移出0)。 我的tvOS客户端中的以下代码中发生错误: 我在集合视图中仅

  • 我有一个购物车,目前允许我添加产品,删除产品,并与一个产品在车上,我可以改变其数量。 然而,如果我在购物车中有两个产品,我试图改变第一个项目的数量,网站就会崩溃。它不会用新的数量重新加载页面,它只是超时,你不能再点击网站上的任何其他链接。 显示数量的代码为: 处理这个问题的代码如下: 我在这里查看了答案,但没有找到解决方案。有人能帮我吗?我会尽力提供可能需要帮助的任何其他信息。 我只是想澄清一下,

  • 问题内容: 在C#.net中,有一个规定,要有两个不同的类文件,并使用关键字partial关键字使它们成为一个类。这有助于将[UI]和逻辑分开。当然,我们可以有两个类来实现这一类,一个用于UI,另一个用于逻辑。可以在Java中实现吗? 问题答案: 源文件分割 不能。Java源代码不能拆分为多个文件。 摘自Wikipedia文章 Java和C Sharp的比较 Sun Microsystems Ja

  • 本文向大家介绍C#中分部方法和分部类分析,包括了C#中分部方法和分部类分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了C#中分部方法和分部类。分享给大家供大家参考。 具体代码如下: 希望本文所述对大家的C#程序设计有所帮助。