[英]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=5000
的map
,则为2.23ms。实际上,时序是如此相似,除非您调用此函数在很多情况下,答案或您自己的代码的选择实际上取决于个人/组织的偏好。
map
将函数应用于迭代器。 在这里,该函数是使用lambda
指定的,以将函数i*(i+1)**2
应用于迭代器中的每个值,这里是range(1,n+1)
。 的sum
,然后总结所有这些个体的回答得到的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.