[Python3]¿Cómo lo puedo optimizar?

Iniciado por reconFito, 14 Enero 2020, 03:34 AM

0 Miembros y 2 Visitantes están viendo este tema.

reconFito

Básicamente se trata de una guía telefónica, la cual tiene ser construida usando diccionarios esa es la restricción, en la cual se puede realizar una búsqueda por  el nombre de la persona y luego imprimir ese nombre con su respectivo número.

PERO TODO INDICA QUE LE FALTA UNA MEJOR OPTIMIZACIÓN.


Gracias por sus respuestas.

Código (python) [Seleccionar]

    def phone_book():
        n = int(input())
        phone_book = {}  # dictionary
        for i in range(n):
            string = input().split()
            phone_book.update({string[0]: int(string[1])})
        return phone_book

    # processing
    def query(phone_book):
        i = 0
        while i < len(phone_book):
            _query = input()
            if _query in phone_book:
                print(f"{_query}={phone_book[_query]}")
            else:
                print("Not found")
            i += 1
    query(phone_book())

[/

engel lex

#1
[code=python]def query(phone_book):
   for i in range(len(phone_book)):
       _query = input()


no entiendo la cantidad de ciclos alli

el primero... estás haciendo un query, entonces para que repetirlo tanto como numeros de telefonos haya? solo lo necesitas hacer una vez y listo...

luego aqui
Código (python) [Seleccionar]
if _query in phone_book:
           for key in phone_book:
               if _query == key:
                   print(f"{key}={phone_book[key]}")
       else:
           print("Not found")

no entiendo que hace el ciclo, es decir si query está en el phone_book, tan simple como que lo puedes acceder, no tienes que recorrer el diccionario, ese es el punto de los mismos...

con correcciones quedaría según mi estilo

Código (python) [Seleccionar]
def phone_book():
   n = int(input("indica cuantos numeros vas a ingresar: ")) # 1*
   phone_book = {}
   for i in range(n):
       buff = input("ingresa el nombre un espacio y el numero: ") # 2*
       nombre, numero = buff.split(" ", 1) # 3*
       phone_book[nombre] = numero # 4*
   return phone_book

def query(phone_book):
   _query = input("ingresa el nombre a buscar: ")
   if _query in phone_book:
        print(f"{_query}={phone_book[_query]}") # 5*
   else:
        print("Not found")

query(phone_book())



1* importante saber que pides
2* cuidado con usar palabras reservadas, no te vaya a traer errores mas adelante
3* aunque parezca redundante ayuda a dejar claro y visible lo que pasa
4* ya que no estás fusionando 2 diccionarios si no agregando un solo elemento, no es necesario usar update con un diccionario temporal
5* cuidado con la impresion de formato, esto es apropiado para debug pero puede traerte problemas en un sistema de produccion
[/code]
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

@XSStringManolo

Los bucles while son más rápidos que los for en prácticamente todos los lengujes (en javascript no porque hacen cosas raras con los engine)

while --n:

Al llegar a 0 para solo porque equivale a false, no tienes que declarar ni iterar i ni comprobar el condicional de i con n.

Si buscas performance usa asyncio, multithread, controla instancias programáticamente o algo así. Testea y compara.

engel lex

#3
Cita de: @?0!,5^34 en 14 Enero 2020, 08:09 AM
Los bucles while son más rápidos que los for en prácticamente todos los lengujes (en javascript no porque hacen cosas raras con los engine)

while --n:

Al llegar a 0 para solo porque equivale a false, no tienes que declarar ni iterar i ni comprobar el condicional de i con n.

Si buscas performance usa asyncio, multithread, controla instancias programáticamente o algo así. Testea y compara.

insisto... los while a nivel de compilador son básicamente lo mismo, incluso si tuvieran 3 o 4 instrucciones extra es irrelevante incluso ante una suma...

por otro lado, mira el tema y el código para tirar de cosas como esas librerias... es decir, virtualmente no creo que sea si quiera posible aplicarlas aqui... estamos hablando de un problema de algoritmia, no de limitacion de sistema

por otro lado en python es preferible que uses el for para navegar los array ya que en el interprete se hace a bajo nivel en comparacion con tu accesandolo por ciclo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

reconFito

Obtuve un buen resultado usando el bucle while en la busqueda.
Pero parece que aun le falta más optimización

engel lex

insisto... ni si quiera se para que haces una busqueda... :s es decir, tienes que obligatoriamente hacer una busqueda con un ciclo? porque python la hace por ti...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

reconFito

Si tengo que usar un ciclo ya que la cantidad de busquedas es igual a la longitud del diccionario.
Es una práctica de HackerRank, con el ciclo while logre componer un error de compilación ahora obtengo un
Runtime Error y busque en san google y encontre que es por falta de optimización pero no se que más hacerle.

engel lex

#7
estás seguro que estás trabajando en python? python no compila, asi que no puedes tener errores de compilacion...

y runtime error es un error generico que no recuerdo que python muestre,  python da errores muy detallados tipo

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined


que interprete de pyhton usas?

como dice exactamente el problema que resuelves?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.


engel lex

disculpa, estaba escribiendo y se mandó el mensaje... aqui completo

Cita de: engel lex en 15 Enero 2020, 01:39 AM
estás seguro que estás trabajando en python? python no compila, asi que no puedes tener errores de compilacion...

y runtime error es un error generico que no recuerdo que python muestre,  python da errores muy detallados tipo

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined


que interprete de pyhton usas?

como dice exactamente el problema que resuelves?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.