【发布时间】:2012-01-28 01:27:18
【问题描述】:
使用高阶函数和 Lambda 会使运行时间和内存效率提高还是降低? 例如,将列表中的所有数字相乘:
nums = [1,2,3,4,5]
prod = 1
for n in nums:
prod*=n
对
prod2 = reduce(lambda x,y:x*y , nums)
除了更少的代码行/使用功能方法之外,HOF 版本是否比循环版本有任何优势?
编辑:
我无法将此添加为答案,因为我没有所需的声誉。 我按照@DSM 的建议使用 timeit 来分析循环和 HOF 方法
def test1():
s= """
nums = [a for a in range(1,1001)]
prod = 1
for n in nums:
prod*=n
"""
t = timeit.Timer(stmt=s)
return t.repeat(repeat=10,number=100)
def test2():
s="""
nums = [a for a in range(1,1001)]
prod2 = reduce(lambda x,y:x*y , nums)
"""
t = timeit.Timer(stmt=s)
return t.repeat(repeat=10,number=100)
这是我的结果:
Loop:
[0.08340786340144211, 0.07211491653462579, 0.07162720686361926, 0.06593182661083438, 0.06399049758613146, 0.06605228229559557, 0.06419744588664211, 0.0671893658461038, 0.06477527090075941, 0.06418023793167627]
test1 average: 0.0644778902685
HOF:
[0.0759414223099324, 0.07616920129277016, 0.07570730355421262, 0.07604965128984942, 0.07547092059389193, 0.07544737286604364, 0.075532959799953, 0.0755039779810629, 0.07567424616704144, 0.07542563650187661]
test2 average: 0.0754917512762
平均而言,循环方法似乎比使用 HOF 更快。
【问题讨论】:
-
你熟悉timeit模块吗?您可以自己测试性能。
-
不,我不熟悉。我会用谷歌搜索timeit。我猜这是一个分析工具。但我仍然想从理论角度了解 HOF 的优势。
-
@RBK 问题在于理论视角无法回答您的问题(运行时间和内存效率)。
-
查看Alex Martelli's answer 到Making a flat list out of list of lists in Python 以获得一个很好的比较方法。
-
@DSM,我已经尝试使用 timeit 进行分析。我无法回答我自己的问题,因为我距离被允许回答我自己的问题还差 1 个声望点。我将尽快发布我的发现作为答案。
标签: python higher-order-functions