[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