2014-04-23 18 views
6

Python, keyfi olarak büyük sayıları temsil edebilen "uzun" adlı bir "bignum" türü sağlar. Bu türün içsel temsili nedir?Bipozlar dahili olarak nasıl temsil edilir?

Kısmen, bu işlemlerde özellikle hangi işlemlerin hızlı veya yavaş olabileceğini merak ettiğim için soruyorum. Örneğin, çarpma veya bölme ile karşılaştırıldığında (özellikle "normal" ints için olduğu gibi), özellikle hızlı bir şekilde kaydırılıyor mu?

+0

Bu ilginç. Bunu test etmelisiniz: hem 'int' hem de long 'üzerinde her türden yüz bin işlem gerçekleştirin ve hangisinin daha hızlı olduğunu görün! – slezica

+0

Bu sadece bir tahmindir, fakat bu uygulamanın uygulanmasına bağlı olmalı ve hangi keyfi hassas kütüphaneye bağlanacağına bağlı olmalıdır. – Hyperboreus

+1

, bakınız örn. http://stackoverflow.com/a/870429/297323 –

cevap

3

CPython'un isteğe bağlı kesinlikli tam sayıları, bir dizi ikili digits depolanır. Her bir digit, 15 veya 30 bitten oluşur. Toplama, çıkarma ve bit vardiyalarının hepsi O (n). Çarpma (yeterince büyük değerler için) O (n ** 1.585) olan Karatsuba multiplication kullanır. Division hala klasik O (n ** 2) algoritmasını kullanır.

0

Bunu yazdım. Bunun ne kadar iyi olduğundan emin değilim, ama daha rafine ve tam bir kıyaslama için bir başlangıç ​​noktası olarak kullanabilirsiniz. Görüyorum Ne

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 

değil çok hızlı int() operasyonlar gerçekten hızlı olduğunu, ancak.

İlgili konular