概括
常见用例之间的实际差异似乎是lambda
functools.partial
functools.partial
需要进口,lambda
不需要。
functools.partial
只需打印创建的函数,就可以看到使用创建的函数的函数定义。使用 创建的函数lambda
应使用 进行检查inspect.getsource()
。
这些被发现实际上是相同的lambda
functools.partial
速度(lambda vs functools.partial)
我认为测试和真实数据比仅仅猜测哪个比另一个更快更能说明问题。
看起来 和之间的速度差异没有统计证据。我用不同的重复次数进行了不同的测试,每次得到的结果都略有不同;这三种方法中的任何一种都可能是最快的。速度与 95% (2 sigma) 的置信度相同。以下是一些数值结果*lambda
functools.partial
# When functions are defined beforehand
In [1]: timeit -n 1000 -r 1000 f_partial(data)
23.6 µs ± 2.92 µs per loop (mean ± std. dev. of 1000 runs, 1000 loops each)
In [2]: timeit -n 1000 -r 1000 f_lambda(data)
22.6 µs ± 2.6 µs per loop (mean ± std. dev. of 1000 runs, 1000 loops each)
# When function is defined each time again
In [3]: timeit -n 1000 -r 1000 (lambda x: trim_mean(x, 0.1))(data)
22.6 µs ± 1.98 µs per loop (mean ± std. dev. of 1000 runs, 1000 loops each)
In [4]: timeit -n 1000 -r 1000 f_lambda = lambda x: trim_mean(x, 0.1); f_lambda(data)
23.7 µs ± 3.89 µs per loop (mean ± std. dev. of 1000 runs, 1000 loops each)
In [5]: timeit -n 1000 -r 1000 f_partial = partial(trim_mean, proportiontocut=0.1); f_partial(data)
24 µs ± 3.38 µs per loop (mean ± std. dev. of 1000 runs, 1000 loops each)
追溯
我还尝试在插入字符串元素的情况下运行f_lambda
和f_partial
使用列表,并且回溯是相等的(当然,第一个条目除外)。所以那里没有区别。
检查源代码
functools.partial
只需打印创建的函数,就可以看到使用创建的函数的函数定义。使用 创建的函数lambda
应使用 进行检查inspect.getsource()
。
# Can be inspected with just printing the function
In [1]: f_partial
Out[1]: functools.partial(<function trim_mean at 0x000001463262D0D0>, proportiontocut=0.1)
In [2]: print(f_partial)
functools.partial(<function trim_mean at 0x000001463262D0D0>, proportiontocut=0.1)
# Lambda functions do not show the source directly
In [3]: f_lambda
Out[3]: <function __main__.<lambda>(x)>
# But you can use inspect.getsource()
In [4]: inspect.getsource(f_lambda)
Out[4]: 'f_lambda = lambda x: trim_mean(x, 0.1)\n'
# This throws a ValueError, though.
In [5]: inspect.getsource(f_partial)
附录
* 测试中使用的设置
from functools import partial
from scipy.stats import trim_mean
import numpy as np
data = np.hstack((np.random.random(1000), np.random.random(50)*25000))
f_lambda = lambda x: trim_mean(x, 0.1)
f_partial = partial(trim_mean, proportiontocut=0.1)
测试是在 Python 3.7.3 64 位 (Windows 10) 上执行的。