Python 是一種非常友好的語言,唯一的缺點是速度慢。與 C、C++ 和 Java 相比,它要慢得多。在線編碼平台,如果提供的 C/C++ 限制為X。通常,在 Java 中提供的時間是2X和 Python,它是5X。
為了提高輸入/輸出密集型問題的代碼執行速度,語言具有各種輸入和輸出過程。\
示例問題:
考慮查找用戶輸入 的N個數字的總和的問題。
輸入一個數字N。
輸入的N個數字由一行中的單個空格分隔。 \
例子:
輸入 :
5
1 2 3 4 5
輸出 :
15
針對上述問題的不同 Python 解決方案:
普通方法 Python:(Python 2.7)
1. raw_input() 采用可選的提示參數。它還從它返回的字符串中去除尾隨的換行符。
2. print只是一個瘦包裝器,它格式化輸入(args 和末尾的換行符之間的空格)並調用給定對象的 write 函數。
# 輸入輸出的基本方法
# 輸入 N
n = int(input())
# 輸入數組
arr = [int(x) for x in input().split()]
# 初始化變量
summation = 0
# 計算總和
for x in arr:
summation += x
# 輸出答案
print(summation)
使用內置標准輸入的更快的方法,標准輸出:(Python 2.7)
1.另一方面, sys.stdin是File Object。這就像創建任何其他可以創建以從文件中讀取輸入的文件對象一樣。在這種情況下,文件將是標准輸入緩沖區。
2. stdout.write('D\n') 比print 'D' 快。
3. 更快的是通過stdout.write(“”.join(list-comprehension))
寫入一次,但這使得內存使用取決於輸入的大小。
# 導入內置標准輸入輸出
from sys import stdin, stdout
# 假設有一個名為 main() 的函數,並且所有操作都已執行
def main():
# 通過 readline 方法輸入
n = stdin.readline()
# 數組輸入類似方法
arr = [int(x) for x in stdin.readline().split()]
#初始化變量
summation = 0
# 計算總和
for x in arr:
summation += x
# 可以使用內置求和 = sum(arr)
# 通過 write 打印答案
# write 方法只寫字符串操作
# 所以我們需要將任何數據轉換成字符串作為輸入
stdout.write(str(summation))
# 調用主方法
if __name__ == "__main__":
main()
時間上的區別:
Timing summary (100k lines each) ——————————– Print : 6.040 s Write to file : 0.122 s Print with Stdout : 0.121 s正如我們到目前為止所看到的,從標准系統獲取輸入並將輸出提供給標准系統始終是提高代碼效率的好主意,這始終是競爭性編程的需要。可是等等!你願意在每次需要的時候寫下這些長行嗎?那麼,使用 Python 有什麼好處。
讓我們討論一下這個問題的解決方案。我們可以做的是讓我們創建單獨的函數來獲取各種類型的輸入,並在需要時調用它們。 \
當您想輸入單行中給出的特定整數整數時
假設輸入是以下形式 \
5 7 19 20
我們想要單獨的變量來引用它們。我們想要的是: \
a = 5
b = 7
c = 19
d = 20
因此,我們可以創建一個名為get_ints() 的函數,如下所示:
import sys
def get_ints(): return map(int, sys.stdin.readline().strip().split())
a,b,c,d = get_ints()
現在您不必一次又一次地編寫這一行。您只需調用get_ints() 函數即可以這種形式接受輸入。在get_ints函數中,我們使用了map 函數。
當您想輸入單行中給出的整數列表時
假設輸入是以下形式\
1 2 3 4 5 6 7 8
我們希望單個變量保存整個整數列表。我們想要的是: \
Arr = [1, 2, 3, 4, 5, 6, 7, 8]
因此,在這裡我們將創建一個名為get_list() 的函數,如下所示:
import sys
def get_ints(): return list(map(int, sys.stdin.readline().strip().split()))
Arr = get_ints()
現在您不必一次又一次地編寫這一行。您只需調用get_ints() 函數即可以這種形式獲取輸入\
當你想輸入字符串時
假設輸入是以下形式 \
juejin 是練習編碼的最佳平台。
並且我們希望單個引用變量將保存此字符串。我們想要的是: \
string = "juejin 是練習編碼的最佳平台。"
因此,在這裡我們將創建一個名為get_string() 的函數,如下所示:
import sys
def get_string(): return sys.stdin.readline().strip()
string = get_string()
現在您不必一次又一次地編寫這一行。您只需要調用get_string() 函數以獲取此表單中的輸入 添加緩沖管道 io:(Python 2.7)
1.只需在提交代碼之前 添加緩沖 IO代碼以加快輸出速度。
2.io.BytesIO對象的好處是它們實現了一個通用接口(通常稱為“類文件”對象)。BytesIO對象有一個內部指針,每次調用 read(n) 指針都會前進。
3.atexit模塊提供了一個簡單的接口來注冊程序正常關閉時要調用的函數。系統_****模塊還提供了一個鉤子 sys.exitfunc,但在那裡只能注冊一個函數。atexit 注冊表可以被多個模塊和庫同時使用 。
# 模板開始
#####################################
# 用於通用級別的輸入/輸出處理的導入庫
import atexit, io, sys
# 使用內存字節緩沖區的流實現。 它繼承了 BufferedIOBase。
buffer = io.BytesIO()
sys.stdout = buffer
# 通過這裡打印
@atexit.register
def write():
sys.stdout.write(buffer.getvalue())
#####################################
# 模板結束
# 遵循常規方法
# 輸入 N
n = int(input())
# 輸入數組
arr = [int(x) for x in input().split()]
# 初始化變量
summation = 0
# 計算總和
for x in arr:
summation += x
# 打印答案
print(summation)
通常在處理大量數據時,正常的方法無法在時限內執行。方法 2 有助於維護大量 I/O 數據。方法 3 是最快的。通常,通過方法 2 和 3 可以幫助處理大於 2 或 3 MB 的輸入數據文件。
注意: 上述代碼在 Python 2.7 中,用於 Python 3.X 版本。只需將raw_input() 替換為Python 3.X 的 input()語法。休息應該可以正常工作。