2013-07-01 63 views
0

我在用各種方法搞亂各種方式來總結一個數字的所有數字,並且在那裏有兩種方式似乎符合我的需要。在Python 2與Python 3中求和數字的代碼速度

sum(map(int,str(num))) #First Method 
def sum_digits(n): #Second Method 
    total = 0 
    while n != 0: 
     total += n%10 
     n /= 10 
    return total 

它沒有在Python讓我感到吃驚2的方法之一是速度較慢,但​​有些東西讓我感到驚訝,當我把同樣的代碼到Python 3中,實際上減緩了第二種方法。我知道地圖在python 3中被改變了,這似乎解釋了第一種方法的加速,但我不明白第二種方法的減速。

我的問題是這樣的:爲什麼第二種方法會減慢? (第二種方法在Python 3和Python 2中的運行速度大約慢了兩倍)。我的示例數據是所有數字,這些數據會被認爲是很長的,但我不確定是否會影響它。

+0

基本上,你的第一行用C完成所有的工作。 – Marcin

回答

3

我可以想象,默認情況下,除法2在Python 2中是整數,在Python 3中是浮點。即使浮點除法本身在現代硬件上與整數除法一樣快,也會將數字重新打包爲浮點格式而後退(模數)可能會讓事情減慢到足以引起注意。

嘗試使用divmod這是專門爲您的情況發明的。

另請參閱:a bit of in-depth look into iterating things in Python,幻燈片28和接下來的幾個。

+1

你的想象是正確的。 '/'在Python 2和3中表示不同的東西。3的''''是2的''''。 –

+0

感謝您的鏈接「深入瞭解Python中的迭代事情」 –

+0

啊,謝謝。我看到我必須改變的是n/= 10到n // = 10才能獲得與之前相同的速度。我忽略了這麼簡單的事情,謝謝。 – PaulC