[Python] Conversione tupla in intero

Valerio De Carolis v.decarolis a yahoo.it
Gio 10 Feb 2011 21:07:12 CET


Il 10/02/2011 19:04, Simone Federici ha scritto:
>>>> from timeit import Timer
>>>> t1 = Timer(""" reduce(lambda x, y: x*10+y, (3,2,6,7,1,21,2)) """)
>>>> t2 = Timer(""" "".join([str(i) for i in (3,2,6,7,1,21,2)]) """)
>>>> t3 = Timer(""" int(  '%s' * 7 % (3,2,6,7,1,21,2)) """)
>>>> "Reduce: {0} | List comprehension: {1} | String%
> {2}".format(t1.timeit(), t2.timeit(), t3.timeit())
> 'Reduce: 1.77485489845 | List comprehension: 3.06255602837 | String%
> 1.46671390533'
>>>> "Reduce: {0} | List comprehension: {1} | String%
> {2}".format(t1.timeit(), t2.timeit(), t3.timeit())
> 'Reduce: 1.77306890488 | List comprehension: 3.03216409683 | String%
> 1.43420696259'
> 
> Indefinitiva, la terza è la più rapida da me.
> La prima è un ottimo compromesso ma ha il difetto di errare i calcoli se la
> tupla contiene interi>9
> La seconda è tragica

Interessante, le prestazioni calano molto se si passa sotto Python3:

t1 = Timer("""  from functools import reduce
                reduce(lambda x, y: x*10+y, (3,2,6,7,1,21,2)) """)
t2 = Timer(""" ''.join([str(i) for i in (3,2,6,7,1,21,2)]) """)
t3 = Timer(""" int(  '%s' * 7 % (3,2,6,7,1,21,2)) """)
t4 = Timer(""" int( ('{}' * 7).format(3,2,6,7,1,21,2) ) """)

"Reduce: {0} | List comprehension: {1} | String {2} | Format
{3}".format(t1.timeit(), t2.timeit(), t3.timeit(), t4.timeit())

Reduce: 3.8765668869 | List comprehension: 5.3515920639 | String
4.34776806831 | Format 5.56084609032

Considerando che il 4° test è supportato solo dal 3.1+: il confronto tra
i due metodi di formatting mi ha lasciato un po' spiazzato.

Cosa introduce la penalità nel 4° medoto? Forse il fatto che format deve
capire che tipo viene passato?

Sulla stessa macchina con Python 2 (test precedente):
Reduce: 1.5680270195 | List comprehension: 3.70982694626 | String%
1.97485089302

Molto meglio, molto veloce! (Linux, x86_64, 2.6.5)

Ciao,
Valerio

-- 
Valerio De Carolis - http://www.decabyte.it

"To invent an airplane is nothing. To build an airplane is something.
But to fly ... is everything. - Ferdinand Ferber"

__________________________________________________
Do You Yahoo!?
Poco spazio e tanto spam? Yahoo! Mail ti protegge dallo spam e ti da tanto spazio gratuito per i tuoi file e i messaggi 
http://mail.yahoo.it 


Maggiori informazioni sulla lista Python