在這段代碼中。
為什么 :
for i in range(0, len(outputdata)):
connectionSocket.send(outputdata[i].encode())
而不僅僅是:
connectionSocket.send(outputdata.encode())
我嘗試了更簡單的版本,它也有效,為什么要逐個字符地做呢?
uj5u.com熱心網友回復:
使用第一種方法,您實際上是每次迭代將outputdata的內容寫入客戶端套接字一個位元組。
假設outputdata變數的實際長度為 100,會發生以下情況:
- range()函式執行一次
- len()函式執行一次
- encode()函式執行 100 次
- connectionSocket.send()執行 100 次
因此,您有 1002 次呼叫,以便僅發送 100 個位元組...
看起來不太好。
此外,在這種特殊情況下,它是由 Python 解釋器完成的,這也為執行這些函式呼叫增加了大量開銷。
現在,使用第二種方法:
- encode()函式執行一次
- connectionSocket.send()執行一次
因此,發送 100 位元組的資料只需要在您撰寫的代碼中進行兩次呼叫。
所以,一般來說,第二種方法看起來更好。
現在,對于您提供的代碼,既不是第一種方法,也不是第二種方法實際上都很好,因為outputdata是一個變數,其中包含記憶體中的整個檔案內容!(參見第 16 行的fp.read())。
所以,fp.read()讀取所有的內容到行程的記憶體,它WILL失敗應的檔案的大小超過可用記憶體。
的編碼()函式創建了一個位元組陣列作為編碼的結果outputdata,有效它因而加倍需要的記憶體量實際上保持兩個變數相同的處理存盤器加倍-的outputdata已經從檔案和所述經編碼版本讀其中,由encode()創建并回傳。
PS,真的,(我的意思是,真的),您鏈接中的代碼不應該在死亡懲罰下在任何型別的生產環境中使用:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313379.html
