簡體   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