[英]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.