簡體   English   中英

Python3 中 str() function 的復雜度是多少?

[英]What is the complexity of str() function in Python3?

我必須創建一個考慮 O(n) 復雜度的 function 並為此我想使用 str() function。

如果出現以下情況,有人可以向我解釋:

str(1000)

由於 1+0+0+0,這個代碼是 O(1) 還是 O(4)?

源代碼中可以看出, int.__str__的實現具有O(m*n)的運行時復雜度,其中m是二進制位數, n是十進制位數。 由於對於 integer i ,任意基數b中的位數由log(i, base=b)給出,並且不同基數中的對數僅相差一個常數,因此運行時復雜度為O(log(i)**2) ,即位數的二次方。

這可以通過運行性能測試來驗證:

import perfplot

perfplot.show(
    setup=lambda n: 10**n,
    kernels=[str],
    n_range=range(1, 1001, 10),
    xlabel='number of digits',
)

性能圖

CVE-2020-10735的問題中還提到了位數的二次時間復雜度:

[...] 一個巨大的 integer 在與具有大量數字的以 10 為底的(十進制)字符串之間轉換時,總是會消耗近二次的 CPU 時間。 不存在有效的算法來做其他事情。

在數據結構的上下文中, O(n)僅表示如果有n項目,那么對該結構的操作將需要(按順序) n次迭代或傳遞才能達到所需的結果。 如果您從 integer 構造一個字符串,那么我猜復雜度將是O(log10(n))

編輯:來自Python 文檔

如果既沒有給出編碼也沒有給出錯誤,str(object) 返回 object。 str (),它是 object 的“非正式”或可很好打印的字符串表示形式。

Python 檢測到 object 是一個int ,因此它將從該 int 創建一個字符串。 實現這種轉換的一種方法是:

if n == 0:
    return "0"
negative = n < 0
if negative:
    n = -n
out = ""
while n > 0:
    digit = n % 10
    n /= 10
    out = chr(48 + digit) + out
if negative:
    out = "-" + out

while 循環內的迭代次數取決於 n 包含的十進制位數,即log10(n)

function 用於字符串轉換。 這意味着將每個值轉換為字符串。 復雜度取決於長度。 如果全長是n,那么復雜度將是O(n)。 如果大小是一個固定的數字,在這種情況下它將執行一個恆定的大小。 我們將常數表示為 O(1)。

暫無
暫無

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

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