2012-03-25 39 views
-1

在python語言中,'>>'運算符和'/'運算符在執行時間方面有什麼區別,當我們將任何整數除以'2'的倍數並且爲什麼?>>和/ in python language

+6

如果它很重要(提示:沒有),那麼最好寫C。 – delnan 2012-03-25 16:50:02

+0

如果你在乎差異,不要使用Python。此外,這可能是特定於CPU的。 – millimoose 2012-03-25 16:51:25

+0

其實我剛剛解決了一個spoj問題,其中執行時間有所不同,所以我很好奇,知道它具有與C – 2012-03-25 16:52:24

回答

2

默認的Python實現的開銷非常大,以至於如果你關心這樣的事情,它是錯誤的語言。 These slides from Unladen Swallow presentation相當亮...

事實上,>>將比/更快。但這不是來自分區的花費,而是來自於確定你是要劃分一個浮點數還是一個整數的開銷!如果改爲由//分(假定INT),這將是一樣快的>> ...

+0

中相同的功能。但根據以下分析,'//'比較慢, >>'in python 2.7.' >>> timeit.timeit('a = 1000000000000000; a // 2') 0.3532679080963135 >>> timeit.timeit('a = 1000000000000000; a >> 1') 0.2281970977783203 ' – 2012-03-25 17:07:27

3

>>只適用於整數。 /的行爲取決於您使用的是2.x還是3.x(或從__future__導入division)。所以重要的區別是不是速度相關。

5

是的,有:

>>> timeit.timeit('a = 32; a/2') 
0.32588499376317426 
>>> timeit.timeit('a = 32; a >> 1') 
0.27532270162828 

的原因似乎是顯而易見的 - 對位操作更快。

無論如何,這種差異是不是使用>>而不是/進行劃分的原因。

+0

我不認爲「對字節的操作更快」解釋了這一切。嘗試比較'a = 32; a * 2'和'a = 32;一個<< 1':至少對我來說,乘法比*移位*快。 – DSM 2012-03-25 17:00:52

+0

@DSM我不能重複你的結果 - 左移乘法的速度更快 – 2012-03-25 17:03:26

+0

對我來說,我得到〜0.081 vs〜0.096(2.7.2)。很明顯,操作執行時間本身受到足夠的噪音(編譯器選項?月相階段?),所以一攬子報表將會很困難。 – DSM 2012-03-25 17:10:00

1

嗯,幾乎可以肯定的是,當事先不知道類型時,位移會更快。但我們可能會很聰明。讓我們來看看:

In [11]: 2**20-37 
Out[11]: 1048539 

In [12]: timeit 1048539 >> 14 
10000000 loops, best of 3: 29 ns per loop 

In [13]: 2**14 
Out[13]: 16384 

In [14]: timeit 1048539 /16384 
10000000 loops, best of 3: 72.2 ns per loop 

In [15]: timeit 1048539 //16384 
10000000 loops, best of 3: 29.1 ns per loop 

注意最後一種情況:如果我們專注於與//整數,它幾乎完全一樣!

特別是在Python中,事先不知道類型,否則很難優化這類東西。另一方面,這意味着/也可以與非整數一起使用 - 這可能是一個錯誤或功能,具體取決於您實際正在做什麼。