Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中Lambda表达式与局部函数的速度测试_Python_Python 3.x_Lambda_Time Complexity - Fatal编程技术网

Python中Lambda表达式与局部函数的速度测试

Python中Lambda表达式与局部函数的速度测试,python,python-3.x,lambda,time-complexity,Python,Python 3.x,Lambda,Time Complexity,我有两份清单: x = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] y = ['a','b','c','d','e','f','g','h','i','j'] 我正在合并这些列表以获得如下词典: z = {97: 'a', 98: 'b', 99: 'c', 100: 'd', 101: 'e', 102: 'f', 103: 'g', 104: 'h', 105: 'i', 106: 'j'} 我正在map功能的帮助下完成此任务 这可以通过两种方式完

我有两份清单:

x = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
y = ['a','b','c','d','e','f','g','h','i','j']
我正在合并这些列表以获得如下词典:

z = {97: 'a', 98: 'b', 99: 'c', 100: 'd', 101: 'e', 102: 'f', 103: 'g', 104: 'h', 105: 'i', 106: 'j'}
我正在
map
功能的帮助下完成此任务

这可以通过两种方式完成:

第一种方式:

z = map(lambda a,b : (a+97 , b), x, y)
def fun(a,b): return (a+97, b)
z = dict(map(fun, x, y))
第二种方式:

z = map(lambda a,b : (a+97 , b), x, y)
def fun(a,b): return (a+97, b)
z = dict(map(fun, x, y))
分析:

z = map(lambda a,b : (a+97 , b), x, y)
def fun(a,b): return (a+97, b)
z = dict(map(fun, x, y))
import timeit
min(timeit.repeat(lambda:dict(map(lambda,b:(a+97,b),x,y)))
def fun(a、b):
返回(a+97,b)
min(timeit.repeat(lambda:dict(map(fun,x,y)))
上面的代码给出了以下输出:

8.535995744000047

8.080758689991

此代码的时差为
0.4552371570005596 ms
。我被告知lambda表达式与用于提高性能(执行速度)的内联函数相同

但根据上述结果,这种想法似乎是一个神话。 这些奇怪的时间测试背后有什么具体原因吗? 具有相同内容的本地函数是否比lambda表达式更快?

我知道完成上述任务的第三种方法,即

z = dict([(k+97 , v) for k,v in zip(x, y)])
使用
7.95090334299936 ms


但是我对上面的测试结果更感兴趣。

使用
min
是一个糟糕的性能指标,因为任何程序的执行速度都会受到机器上运行的其他进程的影响。一个重要样本的平均值信息量要大得多

为什么lambda速度较慢

您在每次迭代timeit时都要重新定义lambda函数,如果将lambda分配给变量并使用它,您会发现没有显著差异

foo = lambda a, b: (a + 97, b)
min(timeit.repeat(lambda:dict(map(foo, x, y))))

使用
min
是一个糟糕的性能指标,因为任何程序的执行速度都会受到机器上运行的其他进程的影响。一个重要样本的平均值信息量要大得多

为什么lambda速度较慢

您在每次迭代timeit时都要重新定义lambda函数,如果将lambda分配给变量并使用它,您会发现没有显著差异

foo = lambda a, b: (a + 97, b)
min(timeit.repeat(lambda:dict(map(foo, x, y))))

没有回答这个问题,但我得到了两个@4.6us/loop的时间相当相同------%%timeit z=dict(map(lambda,b:(a+97,b),x,y))=>100000个循环,最好的3:4.64µs/循环vs.%timeit def fun(a,b):return(a+97,b)z=dict(map(fun,x,y))=>100000个循环,最好的3:4.69µs/循环loop@DarrylG你是对的这只是一个微小的差别,但它的方向是错误的。没有回答这个问题,但我得到了两个@4.6us/loop的时间相当相同------%%timeit z=dict(map(lambda,b:(a+97,b),x,y))=>100000个循环,最好是3:4.64µs每个循环vs.%timeit def fun(a,b):return(a+97,b)z=dict(map(fun,x,y))=>100000个循环,最佳值3:4.69µs/秒loop@DarrylG你是对的,这是一个微小的差异,但它的方向是错误的。也许你是对的,但使用
min
而不是
mean
的更好的理由是由用户权限提供的,重新定义lambda表达式非常耗时。你的解决方案奏效了。感谢您可能是对的,但是使用
min
而不是
mean
的更好理由是由用户权限提供的,重新定义lambda表达式非常耗时。你的解决方案奏效了。谢谢