[Python-es] Pythoniano y c niano
Chema Cortes
pych3m4 en gmail.com
Mie Dic 26 21:22:42 CET 2012
El día 26 de diciembre de 2012 18:40, kausdiv <kausdiv en gmail.com> escribió:
> Para ilustrarlo mejor compara el código que ha escrito Chema con el mio del
> principio: (aunque ambos usen formas distintas de conseguir los primos)
No son comparables ya que se tratan de diferentes algoritmos. Tan sólo
pretendía ilustrar que a veces es el lenguaje es quién determina qué
método va mejor.
> -----Codigo de Chema------
>
>
> def primes(n):
>
> criba = {1,2}|set(range(3,n+1,2))
> seq = (set(range(i+i,n+1,i)) for i in xrange(3,n+1,2) if i in criba)
> for x in seq:
> criba -= x
>
> return criba
> -----------El mio---------------
>
> def fprimos(n,x):
> l=[]
> for i in range(n,x):
> isprime=1
> for k in range(2,i):
> if i % k ==0 and i<>k:
> isprime=0
> break
> if isprime==1:
> l.append(i)
> return l
> ---------------------------------------
Pongo la versión que sería "comparable" con ésta (menos optimizada que
la que usaba sets):
def fprimos(n,x):
def isprime(n):
return all(n%k!=0 for k in range(2,n))
return [x for x in range(n,x) if isprime(x)]
en una sóla línea:
def fprimos(n,x):
return [x for x in range(n,x) if all(n%k!=0 for k in range(2,n))]
Algunas recomendaciones:
1) evitar almacenar estados intermedios (fuera contadores y variables
intermedias)
2) huir del list.append() (usar las "compresiones" en su lugar)
3) la mejor optimización es saber usar los recursos del lenguaje (sum,
max/min, all/any, sorted, zip, reduce, itertools, collections, ...)
4) evitar convertir los interadores a listas hasta el último momento
(usar 'itertools')
--
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales
Más información sobre la lista de distribución Python-es