2014-04-23 54 views
6

Python提供了一個名爲「long」的「bignum」類型,它可以表示任意大的數字。 這種類型的內部表示是什麼?bignums如何代表內部?

我問一部分是因爲我很好奇哪些操作可能在這些數字上特別快或慢。例如,與乘法或除法相比,位移特別快(因爲它是「常規」整數)?

+0

這很有趣。你應該測試它:在'int'和'long'上執行每種類型的十萬次操作,並且看哪個更快! – slezica

+0

這只是一個猜測,但是這應該取決於實現以及它所鏈接的任意精度庫。 – Hyperboreus

+1

參見例如http://stackoverflow.com/a/870429/297323 –

回答

3

CPython的任意精度整數存儲在二進制數組digits中。每個digit由15位或30位組成。加法,減法和位移都是O(n)。乘法(對於足夠大的值)使用Karatsuba multiplication,它是O(n ** 1.585)。 分部仍然使用經典的O(n ** 2)算法。

0

嗯,我寫了這個。我不確定這有多好,但是您可以將其作爲更精確和更完整的基準的起點。

import timeit 

def timef(f, *args): 
    return timeit.timeit(lambda: f(*args), number = 1000000) # repetitions 


tests = { 
    'addition'  : lambda x: x + 17, 
    'substraction' : lambda x: x - 17, 
    'multiplication': lambda x: x * 17, 
    'division'  : lambda x: x/17, 
    'float division': lambda x: x/17.0 
} 


for name, f in tests.items(): 
    print 'int {0}'.format(name).ljust(20), timef(f, 0) 
    print 'long {0}'.format(name).ljust(20), timef(f, 10 ** 50) 
    print 

我所看到的是,int()操作的確是更快,但不是很多更快。