gpt4 book ai didi

python - 时间和部分

转载 作者:行者123 更新时间:2023-12-01 04:54:47 25 4
gpt4 key购买 nike

检查这个Python代码:

 from functools import partial
def summer(x, y):
return x+y

>>>partial(summer, 1, 2)
<functools.partial object at 0x10e648628>

但是,当我通过部分时间 timeit 时:

  import timeit
min(timeit.repeat(partial(summer, 1, 2)))

似乎用 x=1 和 y=2 来评估夏天。

我明白发生了什么吗?我使用 timeit 正确吗?当我为每个参数传递值时,如何部分评估 Summer?

编辑:为了清楚起见,我添加了以下评论作为此问题的一部分。

我的问题是partial(summer, 1, 2) 不评估summer。那么为什么在 timeit.repeat 内调用它会评估 Summer 呢?

最佳答案

在 Python 中 function 对象是 "first-class" objects 。它们可以像任何其他对象一样作为参数传递给函数。在这种情况下,timeit.repeat 正在传递函数对象 partial(summer, 1, 2),以便稍后在 repeat 内部可以将函数对象调用并计时。

partial(summer, 1, 2) 本身是将一个函数 (summer) 作为参数传递给另一个函数 (partial) 的另一个示例>)。您希望传递函数对象是有道理的,因为您还不想调用 summer 。相反,您希望 partial 返回的函数对象能够访问 summer,以便稍后在调用该函数对象时调用它。

<小时/>

partial(summer, 1, 2) 返回一个函数对象:

In [36]: partial(summer, 1, 2)
Out[36]: <functools.partial at 0x7ff31f0bd3c0>

如您所知,要调用该函数,您需要在函数后面放置括号:

In [37]: partial(summer, 1, 2)()
Out[37]: 3
<小时/>

通常,当我使用 timeit 时,我会传递一个语句 stmt 并将其设置为字符串形式的 timeit 函数:

In [41]: func = partial(summer, 1, 2)

In [42]: timeit.repeat('func()', 'from __main__ import func')
Out[42]: [0.11481308937072754, 0.10448503494262695, 0.1048579216003418]

但是,您是正确的,也可以传递可调用对象(例如函数对象)作为第一个参数:

timeit.repeat(func) 

repeat 将调用 func 并对结果进行计时。您可以使用 pdb 等调试器单步调试代码,了解 repeat 如何处理这种情况:

import pdb
pdb.set_trace()
timeit.repeat(func)

timeit.py的代码中 around line 140你会看到:

    elif callable(stmt):
self.src = None
if isinstance(setup, str):
_setup = setup
def setup():
exec(_setup, global_ns, local_ns)

它检查stmt,第一个参数是否可调用。如果是,则它将 func 设置为 stmt,然后调用 func ( source code )。

def inner(_it, _timer, _func=func):
setup()
_t0 = _timer()
for _i in _it:
_func() # <--- The function call happens here
_t1 = _timer()
return _t1 - _t0
return inner
<小时/>

关于python - 时间和部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27695575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com