簡體   English   中英

python 中的反向 function 是如何實現的?

[英]How is reversed function in python implemented?

我一直在嘗試使用就地重新排序元素來反轉 python 中的列表
使用

def reverseArray(a):

    for i in range(int(len(a) / 2)):
        temp = a[i]
        a[i] = a[len(a) - i - 1]
        a[len(a) - i - 1] = temp

    return a

我使用以下腳本運行基准測試

for s in range(20):
    a = [i for i in range(30002023)]
    tick = time.time()
    reverseArray(a)
    tok = time.time()
    print(f"tok-tick:{tok-tick}")

這給了我以下 output

tok-tick:5.572033643722534
tok-tick:5.721977472305298
tok-tick:6.386164665222168
tok-tick:7.384392738342285
tok-tick:10.91420841217041
tok-tick:7.937604904174805
tok-tick:6.611226320266724
tok-tick:5.531114339828491
tok-tick:6.300005674362183
tok-tick:5.5767083168029785
tok-tick:5.933243274688721
tok-tick:5.885504961013794
tok-tick:5.496972560882568
tok-tick:5.854052543640137
tok-tick:5.983134984970093
tok-tick:5.644777059555054
tok-tick:6.585403680801392
tok-tick:6.760901927947998
tok-tick:5.675948619842529
tok-tick:6.09527063369751

但是當我使用反向數組 function 在同一基准上運行預定義的 function 時,使用

def reverseArray(a):
    return [ e for e in reversed(a)]

我得到了以下 output

tok-tick:0.9134881496429443
tok-tick:0.922814130783081
tok-tick:0.9020524024963379
tok-tick:0.9431264400482178
tok-tick:0.8796248435974121
tok-tick:0.9475719928741455
tok-tick:0.9039063453674316
tok-tick:0.9342403411865234
tok-tick:0.8823723793029785
tok-tick:0.9073545932769775
tok-tick:0.869114875793457
tok-tick:0.899376630783081
tok-tick:0.8696825504302979
tok-tick:0.9529657363891602
tok-tick:0.8960628509521484
tok-tick:0.9192886352539062
tok-tick:0.9400691986083984
tok-tick:0.9219272136688232
tok-tick:0.8531026840209961
tok-tick:0.9414753913879395

我真的很想知道為什么性能會有如此巨大的差異?

列表更快,因為list是內置類型,並且它的__reversed__方法在 C 中實現,這當然比普通的 Python 更快。

Python 本身是用 C 編寫的,解釋器執行從 Python 代碼生成的字節代碼。 從某種意義上說,這個字節碼的每條指令都是一個C function。 正如您可以使用dis模塊檢查的那樣,您的代碼實際上編譯為很多指令 - 多次調用 C。 但是list.__reversed__在某種程度上是一個單一的 C function。 調用一個 function 當然比調用多個要快。

我說“在某種意義上”和“在某種程度上”,因為它實際上並沒有什么不同:字節碼指令是一個巨大的 function 的一部分,但它並沒有真正的區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM