2014-03-03 144 views
6

我是在現代化的一些遺留代碼,當我偶然到以下行的中間:什麼是將奇數舍入到偶數的最佳方式?

rounded_val = (len(src_string)/2) * 2

它是什麼做的,它正在採取的Python's weird integer division優勢,圓字符串的長度值,如果奇數,則以之前的第一個偶數值爲。但是整數除法即將在Python 3中改變,我需要改變這一行。起初我以爲這:

rounded_val = len(src_string) if len(src_string)%2 == 0 else len(src_string)-1

但調用len() 3倍。然後我想到了使用最初的想法,但與地板分區運營商//,並認爲它可能不那麼兼容,這樣做,我應該使用math.floor()而不是(然後我需要有另一個導入math)。

我可能會反思這個,但最佳方式在Python中做到這一點?

PS:輸出需要是一個整數。

+0

你想奇數整數還是舍入? –

+1

倒了,這是在問題。 –

+1

你知道他們怎麼說*過早優化是萬惡之源?*你的問題中的「慢」函數和選定答案之間的差異是0.1 *微秒*。即使您連續執行了一百萬次這些計算,性能差異也只有100毫秒。所選的答案很聰明,但如果你的同事有可能不瞭解位數學,那麼使用更明確的地板劃分算子。 P.S.不要說「這看起來更快」 - 證明它。 Python有一個專用於此的[timeit]模塊(http://docs.python.org/2/library/timeit.html)。 – nemec

回答

4

如何:

rounded_val = len(src_string) & (-2) 

雖然有時並不明顯的人不熟悉的二進制算術。

+1

用於拼出-2,但是AShelly已經擊敗了它。 – kojiro

+1

是的,我提交了我的後我看到ASILLY提交。他一分鐘都打敗了我。 – Vlad

+0

@粗暴地毆打你,但由於你的回答需要較少的操作,爲了社區的緣故,我會將你的標記標記爲正確。 –

19

使用//地板師代替,如果你不喜歡依靠Python的2 /行爲整數操作數:

rounded_val = (len(src_string) // 2) * 2 
+1

問題不在於我不喜歡它,是因爲Python 3中的分區行爲會發生變化,並會破壞該行。 –

+3

@LuizBerti:當然,如果你希望你的代碼在不同版本上兼容,那麼使用''''而不是'/'是絕對要走的路。 –

+1

@LuizBerti:雖然掩飾負面1也是可愛的。 –

1

爲什麼不這樣:

rounded_val = len(src_string) - len(src_string) % 2 
+0

仍然調用len()兩次。可能不是最好的方式... –

2

//操作可能你最好的選擇,但你也可以使用divmod功能:

rounded_val = divmod(len(src_string), 2)[0] * 2 
10

也許

rounded_val = len(src_string) & ~1 

這只是清除1S位,這是你所需要的東西。只適用於int s,但len應始終爲整數。

+0

我喜歡你認爲我親愛的先生的方式,按位運算符可能比數學運算更快。非常感謝! –

相關問題