2010-03-23 5 views
2

Voici un morceau de code qui prend le plus de temps dans mon programme, selon les statistiques timeit. C'est une fonction sale de convertir les flottants dans [-1.0, 1.0] intervalle en entier non signé [0, 2 ** 32]. Comment puis-je accélérer floatToInt?Conversion de float en int plus rapide en Python

piece = [] 
rng = range(32) 
for i in rng: 
    piece.append(1.0/2**i) 

def floatToInt(x): 
    n = x + 1.0 
    res = 0 
    for i in rng: 
     if n >= piece[i]: 
      res += 2**(31-i) 
      n -= piece[i] 

    return res 

Répondre

4

Avez-vous essayé le modèle le plus évident?

def floatToInt(x): 
    return int((x+1.0) * (2**31)) 
+0

Non, j'ai compliqué les choses. Cela a fonctionné 10 fois plus vite. –

+3

2 ** 31 évalue à 2147483648 à chaque fois. Puisque vous êtes concentré sur la vitesse ici, remplacer 2 ** 31 par cette constante est un calcul de moins que vous aurez besoin de faire dans votre segment de code critique. – PaulMcG

+0

J'ai vérifié avec timeit et 2 ** 31 est seulement plus lent quand il n'y a pas de "x" dans l'équation ?? – pixelbeat