2014-03-25 127 views
6

我試圖決定在需要從STDIN獲取輸入行時使用哪一個,所以我想知道如何在不同情況下選擇它們。sys.stdin.readline()和input():讀取輸入行時哪個更快,爲什麼?

我發現了一個以前的帖子(https://codereview.stackexchange.com/questions/23981/how-to-optimize-this-simple-python-program)說:

如何優化這些代碼的時間和內存方面使用?請注意,我使用不同的函數來讀取輸入,因爲當讀取字符串時,sys.stdin.readline()是最快的函數,讀取整數時輸入()是最快的。

這句話是真的嗎?

+0

這在'python 2.7'中可能是正確的,因爲'input'試圖將輸入字符串評估爲python表達式。有可能是一個優化,使讀'input()= 1'比'int(sys.stdin.readline())'更快。在'python 3.x'中,'input()'已經變成'python 2.7'的'raw_input()',這意味着它只是將輸入作爲一個字符串返回並且不進行評估,所以它可能完全相同。 – aruisdante

回答

9

內置的inputsys.stdin.readline功能並不完全一樣,而哪一個更快可能取決於您正在做什麼的細節。正如aruisdante所評論的那樣,Python 3中的差異比Python 2中的差異要小,因爲您提供的引用來自但是仍然存在一些差異。

第一個區別是input有一個可選的提示參數,如果解釋器以交互方式運行,將會顯示該參數。這會導致一些開銷,即使提示是空的(默認)。另一方面,如果您確實需要提示,則可能會比在每個readline調用之前執行print更快。

下一個不同之處在於input從輸入結尾剝離了任何換行符。如果你要去掉那個,可以讓input爲你做,而不是做sys.stdin.readline().strip()

最後的區別是如何指示輸入的結尾。如果沒有更多輸入(標準輸入已在另一端關閉),則在您調用input時將調用EOFError。另一方面,sys.stdin.readline會在EOF中返回一個空字符串,您需要知道該字符串用於檢查。

還有第三種選擇,在sys.stdin上使用文件迭代協議。這很可能與調用readline非常相似,但也許更好的邏輯。

我懷疑,雖然各種選項之間的性能差異可能存在,但它們可能比從磁盤簡單讀取文件(如果它很大)的時間成本更小,並且無論您在做什麼它。我建議你避免過早優化的陷阱,只做你的問題最自然的事情,如果程序太慢(「太慢」是非常主觀的),你可以做一些分析,看看最需要什麼時間。不要花大量精力去決定採取不同的投入方式,除非它真的很重要。

+1

緩衝模式可能存在差異,而重定向會影響性能。 'input()'可以使用['readline(3)'](http://www.gnu.org/software/readline/)(手冊頁說:*「BUGS:太大又太慢。 「*)。 – jfs

+0

@eryksun:[文檔沒有提到這樣的東西](http://docs.python.org/3/library/functions.html#input)。假設你對當前的CPython版本說的是真的,你想說什麼與「哪個是更快的sys.stdin.readline()或input()」有關? – jfs

+0

看起來像第三個選項(迭代器)緩衝結束。如果您現在需要它,請使用readline() –

相關問題