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表达式非常耗时。你的解决方案奏效了。谢谢