繁体   English   中英

关于 Python 中的迭代函数

[英]About Iterative Functions in Python

我试图弄清楚是否有更有效的编码方式,但我不能。 谁能帮我弄清楚是否有更有效的编码方法?

所以这里是代码:

def iterative(n): 
     sum = 0 
     for i in range(1,n+1): 
         form = i*(i+1)**2 
         sum = sum + form
     return(sum)

提前致谢!

如果你的意思是更短,那么:

def iterative(n):
    return sum(i * (i + 1) ** 2 for i in range(1, n + 1))


print(iterative(10))

对这里的所有答案进行了一些效率测试:

def iterative1(n):
    return sum(i * (i + 1) ** 2 for i in range(1, n + 1))


def iterative2(n):
    sum = 0
    for i in range(1, n + 1):
        form = i * (i + 1) ** 2
        sum = sum + form
    return (sum)

def iterative3(n):
    return sum(map(lambda i: i*(i+1)**2, range(1,n+1)))

import time

x = time.time()
print(iterative1(10000000))
print( time.time() - x) # 5.313434600830078

x =  time.time()
print(iterative2(10000000))
print(time.time() - x) # 5.021821975708008

x =  time.time()
print(iterative3(10000000))
print(time.time() - x) # 5.61063551902771

似乎你是最快的(但 IMO 可读性较差)

如果您真的在寻找速度,您可以进行数学计算并从中删除迭代方面。 多项式的总和可以分解为总和,这些小总和可以用这样的东西直接解决(如果数字很大,请注意浮点精度):

def iterative4(n):
        return (n * (n + 1)//2)**2 + (n * (n + 1) * (2 * n + 1))//3 +  (n * (n + 1))//2

例如,在这里,它快了几个数量级——你可以用迭代方法计算一次 n = 10000000 的值大约 15000 次:

def iterative1(n):
    return sum(i * (i + 1) ** 2 for i in range(1, n + 1))

def iterative4(n):
    return (n * (n + 1)//2)**2 + (n * (n + 1) * (2 * n + 1))//3 +  (n * (n + 1))//2


x =  time.time()
print(iterative4(10000000))
print(time.time() - x) 

#2500001166666841666675000000
#0.00030493736267089844

x =  time.time()
print(iterative1(10000000))
print(time.time() - x)

#2500001166666841666675000000
#4.789726972579956

另一个Pythonic版本:

def iterative(n):
    return sum(map(lambda i: i*(i+1)**2, range(1,n+1)))

map与列表/生成器的理解是Python中一个有争议的话题 ,因为理解更容易阅读和理解,但是map可以提高性能。 我刚刚测试了当前的答案,并且对于高n值,map的速度要小一些(我测得的理解力为3.17ms,对于n=5000map ,则为2.23ms。实际上,时序是如此相似,除非您调用此函数在很多情况下,答案或您自己的代码的选择实际上取决于个人/组织的偏好。

map将函数应用于迭代器。 在这里,该函数是使用lambda指定的,以将函数i*(i+1)**2应用于迭代器中的每个值,这里是range(1,n+1) sum ,然后总结所有这些个体的回答得到的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM