« first day (1992 days earlier)      last day (1101 days later) » 

11:00 AM
@AQMR he mejorado el resultado en un 200%
 
a ver
 
xd entra en el fiddle
 
XDDDDDD
 
xDD
 
Te juro que me imaginaba algo como eso
 
11:01 AM
Espera
se me ha ocurrido algo mejor
 
Por favor no pongas un pene dando vueltas
 
Ahora
ahora
XDDD
NO PUEDE SER
Estoy llorando xDD
 
no veo nada nuevo
 
¿Ahora? xD
creo que no había guardado
 
nop
 
11:03 AM
:(
 
ups
 
Lo sabia
XD
 
xDDD
me has leído la mente
 
Sabes qué es lo peor?
Que se me ha ocurrido otra forma de hacerlo más asqueroso
Pero no lo voy a hacer XD
 
11:06 AM
xD
 
Voy a seguir practicando
pd: Ayer en el FF7 me enfrenté a ARMA Rubí, y quise llorar
Y no es el más dificil, que es lo peor...
 
11:26 AM
@AQMR que eso ?
 
Final Fantasy 7, el segundo jefe final más poderoso
bueno, jefe opcional
Porque el final es una broma
 
Ah
Que pereza me da FF en verdad
 
Depende cual
 
yo estoy con unos amiwis haciendo un versuslocke de pokemon renegade platinum xd
 
A mi
Que es un versuslocke?
 
11:28 AM
como palmamos en el primer gimnasio, no te haces a la idea de la polla que comimos xdxd
 
renegade? no lo conozco
Que reglas son?
 
@AQMR es una forma de jugar, hay normas y vidas, no te voy a contar todas, pero solo se pueden capturar 2 pokemon por ruta, solo se pueden comprar 2 pociones por ruta, si pierdes un pokemon muere y no lo puedes revivir, el nivel de los pokemon no pueden superar el nivel más alto que el del lider del gimnasio...
Entre otras, la gracia del versus es que cada vez que terminas un gimnasio haces un combate con tus amiwis, y el que gana se lleva puntos, y pues eso, el que más puntos tenga, o el que más lejos llegue, gana.
Y pokemon renegade platinum es un hackrom de pokemon platino (juego modificado por fans), que es bastante más complicado y cambia cosas del juego original
 
anda
Eso mola1
Pero entonces estás supeditado un poco a la suerte de que te toque un pokemon con buenos IV's...
El inicial es random?
 
No, bueno, hicimos una ruleta, a mí me toco el de planta
@AQMR es parte de la gracia, el lider del primer gimnasio tenía un onix que pegaba más rápido que cualquiera de todos mis pokemitos :c bastante ilegal, la verdad
 
Cuáles llevabas?
 
11:35 AM
@AQMR Turtwig, Wartortle, Kadabra, Torchic, Beldum y Riolu
Tenía un Geodude con puño fuego y un Cranidos con puño trueno c:
 
A ese nivel Beldum, meh
Pero lo demás, es bueno
Tenías XD
 
hablo del lider xd
 
ah...entonces se ventiló a tu equipo de una XD
 
Si c:
Dos veces
 
Porque al único que no le afecta x2 es kadabra, y con su mierda de defensa....
 
11:37 AM
A mí y a los otros 2 que jugaban conmigo xd tuvimos que pasar de las normas en ese combate para seguir jugando xd porque palmamos los 3
 
Siempre hay solución hombre
A tus amigos les tocaba el mismo adversario?
 
12:02 PM
@AQMR cí
 
Madre mia, estoy descubriendo el mundo del import/export en js y me está emocionando demasiado XD
 
12:32 PM
Hola a todos
Si alguien me puede ayudar
0
Q: Poner CDATA a XML

Pedro ÁvilaTrabajo con VB.NET he convertido un archivo XSD a clase para crear un archivo XML, pero tengo la necesidad de poner un CDATA al valor de un nodo. Tengo el siguiente código: Dim invoice As InvoiceType = New InvoiceType() Dim idType = New IDType() idType.Value = "F001-009478" invoic...

 
1:13 PM
@PedroÁvila Buenas.. vi tu pregunta ayer... vos queres guardar un cdata y no te deja?
 
Buenas tardes
 
@AQMR Cuando empieces con Typescript vas a flipar, entonces xD
 
1:31 PM
o/
 
@g3rv4 que tal ese trabajo nuevo
 
@Pikoh arranco el Lunes :) aunque ya tengo todo instalado y estoy chusmeando el código
 
@g3rv4 ah, pense que ya había empezado! Suerte :)
 
@Pikoh :) gracias! me tomé unas semanitas en el medio
 
@g3rv4 bien hecho, para coger fuerzas y prepararte
 
1:34 PM
¿Hay alguna forma de aplicar un if a un foreach, para que, en caso de que una variable no esté definida, haga lo del dentro del foreach una única vez?
No sé si me estoy complicando mucho o si debería simplemente hacer un do while
 
@Aritzbn que lenguaje y donde esta el codigo
 
en c# si no recuredo mal puedes hacerlo con un break;
 
@JackNavaRow typescript y tampoco es mucho, te hago un mcve rapidito
 
@NicolasOñate correcto. y en javascript en las ultimas versiones diria que tambien
 
@Aritzbn como has llegado a querer hacer eso? que necesitas?
 
1:37 PM
@Aritzbn typescript es Javascript por debajo puedes usar un continue;
 
if(lista != undefined){
   lista.foreach( item => {
      noseque += item.noseque;
      nosecuantos += item.nosecuantos
   });
}else{
   noseque = 0;
   nosecuantos = 0;
}
 
@Aritzbn con ese foreach lo dudo
 
{noseque , nosecuantos} = lista?.foreach( item => {
      noseque = item.noseque;
      nosecuantos = item.nosecuantos
}) ||{0,0};
 
@JackNavaRow bueno, he puesto noseque, nosecuantos, pero hay bastantes más cosas dentro xD
 
bueno... el codigo esta mal
debe ser un reduce
 
1:40 PM
Voy a hacer una chapuza de las mías y a intentar dejarla bonita
 
que quieres hacer exactamente ? acumular? filtrar?
 
muchas cosas xD
 
imaginate...., el else lo puedes eliminar inicializando las variables en cero
 
Lo que quiero es evitar codigo redundante
he hecho esto, me resulta feo, pero así evito redundar
  if(this.lista== undefined){
    this.lista= [0]
  }
Así pasa siempre por el foreach, y como a la API llega un 0, puedo identificar que el id está en el token y no en los parametros
Parece que funciona, me da miedo xD
 
this.lista = this.lista || [0]
 
1:45 PM
@PabloLozano qué es esto? es legal?
o-o
 
@Aritzbn claro
 
Nunca lo había visto
ahora estoy indignado xd
Eso funciona en C#?
 
Ah, pues nada, dejo los ternarios feos
 
a = b || c
es if (b) { a=b} else {a=c}
y b se considera "true" siempre que no sea una cadena vacía, null, undefined, 0 o false
es válido en TS/Js
 
1:49 PM
Anda !
:) que guay
 
12
Q: ¿Porque al evaluar un valor que no es boolean en JavaScript dentro de un if este me if me devuelve un true o false?

David WilllockVerán, estaba practicando condicionales y usando el operador de corto circuito para asignar un valor a una variable,no comprendí muy bien porque los valores se consideran verdaderos o falsos aunque estos no sean booleanos. Probe este ejemplo let hola,hola2="Hola mundo" hola = hola2 || "Adi...

 
const items = [{noseque : 1, nosecuantos: 5},{noseque : 2, nosecuantos: 3}]
//const items = undefined
let {noseque,nosecuantos} = items?.reduce((acum, item) =>{
  	acum.noseque += item.noseque;
    acum.nosecuantos += item.nosecuantos
  return acum;
},{noseque:0,nosecuantos:0}) || {noseque:0,nosecuantos:0}
console.log(noseque,nosecuantos)
 
¿Por qué estas cosas no se enseñan en clase?
 
Lo único bueno que conozco de PHP, que hace mas o menos lo mismo: ` $A ?? $B ?? $C`
 
5 mins ago, by Pablo Lozano
this.lista = this.lista || [0]
esto es más bonito uwu
 
1:51 PM
this.lista = this.lista ?? otra_cosa ?? otra_cosa
coge el primero que no sea null
 
@Aritzbn te explique lo que mostraste
 
y puedes poner varios
 
@Trauma En JS puedes hacer lo mismo, creo
 
@JackNavaRow jsjs
Me voy a comer, ya he aprendido algo nuevo
Hasta mañana gente
 
let a= 0, b= false, c=3;

>a || b || c
3
>a || c || b
3
>a || b
false
>b || a
0
 
1:54 PM
@PabloLozano Creo que si ... pero es que es lo único bueno que conozco de PHP, y queria ponerlo :-)
ah, pero PHP solo compara con null, no con false
 
ahora se va a poner exquisito PHP
false, null, undefined...
 
¡¡ HAHAHAHA !!
 
@Trauma PreProcessor Hyper Trauma
 
:-p
 
claro que undefined sólo lo tiene JS, creo
como algo distinto de null
 
1:55 PM
creo que si, python no lo tiene, ni LUA
 
Lua devuelve Null si no me equivoco...
 
sip, pero no tiene undefined
 
Exacto
 
creemos que solo está en JS
 
@Trauma tengo qntendido que si
 
1:57 PM
Seguro que alguno raro de esos, tipo brainfuck lo tiene xD
 
Para mi que no mande error cuando no está definido es una caracteristica poco amigable a la hora de saber la causa de un error...
Y más que envie Null. Es una buena idea la de Javascript esa caracteristica de undefined
Pero me parece mejor que de error cuando no encuentra un atributo, como hace Python
 
A mi me gusta el undefined
 
A mi me parece mejor que el Null de Lua
 
Yo lo veo como un valor mas
 
@Trauma es un valor mas
 
2:03 PM
osea, no es que yo pusiera ahí'null como un valor, es que directamente no lo puse
que lo veo práctico, quiero decir
 
Yo tambien lo veo practico
 
Pero mejor que diga "error, x is not defined"
 
@Trauma con lo bonitas que son las excepciones. O los errores de compilacion aun mejor
 
Lo segundo, sin duda :-)
Aunque con lo primero me apaño también :-)
 
2:05 PM
entonces...PARA QUE QUIERES UNDEFINED!!!!
XD
 
jejeje
cuando ando jugando con JS
 
undefined es un parche para un pseudo lenguaje como js
 
Me parece más optimizado eso de que un código se compile y los errores sucedan allí en lugar de que el programa revise constantemente si hay o no un error
Debo de admitir que eso supera a un lenguaje interpretado como Python
Ohhhhhhh!!!!
 
ah carajo, te entend'i alrevés
 
xD
 
2:06 PM
jeje
Luego la gente se queda de lo dificil que es trabajar con fecha en lenguajes interpretados:
const char *FxLogger::logTime( ) {
    timeval tp;
    gettimeofday( &tp, 0 );
    time_t curtime = tp.tv_sec;
    tm *t = localtime( &curtime );
    sprintf( m_logTime, "%02d:%02d:%02d:%03d\n", t->tm_hour, t->tm_min, t->tm_sec, tp.tv_usec / 1000 );
}
eso solo para mostrar la hora actual con milisegundos :-(
 
Vaya :c
Mucho!
 
Enga, a probarlo
 
@Trauma las fechas son dificiles de trabajar en cualquier lenguaje, incluso JAVA
 
o sea..eso hace lo mismo que Console.WriteLine(DateTime.Now) en C#
 
Que envidia me dais a veces >:-(
 
2:10 PM
@JackNavaRow en java da pena. En C# es facilismo
 
@JackNavaRow En Python con el modulo Datetime tambien?
 
Carajo, me faltó el return :-((
 
@Trauma no te preocupes devolvera undefined esperen eso no es Javascript
que mala suerte tienes
 
pues casi casi ... es un comportamiento indefinido xDD
pero compila, por desgracia :-(
 
@Trauma pfff
cada dia soy mas feliz con my C#
 
2:12 PM
Yo no inventé las normas, solo me peleo con ellas :-(
 
@gbianchi estas ?
 
Bueno, por lo menos funciona:
16:13:35:544 - INFO - fxloader initialized, commit
16:13:35:694 - INFO - service type:Distributor
16:13:35:694 - DEBUG - creating MtoConnector object
16:13:35:694 - DEBUG - Loading Distributor.dll
16:13:35:948 - DEBUG - Execute distribute funtion
Bonita hora actual con milisegundos :-|
 
@JuanPerez sip
 
2:34 PM
@gbianchi tengo una consulta mysql donde hago 11 consulta todas juntas con UNION ALL algo asi:
 
@JuanPerez suena feo
 
SELECT reg.fecha, reg.hora, ROUND(SUM(reg.porcentaje)/11,0) total
FROM
(
    SELECT DATE_FORMAT(cen.fecha, '%d-%m') fecha, TIME_FORMAT(cen.hora,'%H') hora, ROUND((SUM(cen.respuesta)/SUM(cen.connectt))*100,0) porcentaje
    FROM asr_dms_anto cen
    INNER JOIN grupos_rutas gru ON cen.gtroncal = gru.ruta AND gru.central = 'DMS_ANTO' AND gru.grupo = '".$grupo."'
    WHERE cen.fecha >= DATE_ADD(DATE_ADD(LAST_DAY(now()),INTERVAL 1 DAY),INTERVAL -1 MONTH)
        AND cen.fecha <= LAST_DAY(DATE_ADD(LAST_DAY(now()),INTERVAL -0 MONTH))
Estoy buscando en N tablas para sacar el porcentaje de cada una de ella, esto con la finalidad de mostrar resultado en un grafico..
ROUND(SUM(reg.porcentaje)/11,0) total
 
ok-- y?
 
Ahi obtengo todos todos los registros de las 11 consultas hago esto un /11 que serian las 11 query y eso me da un porcentaje
 
aja...
 
2:41 PM
Entonces, lo que estoy viendo es que hay veces que en algunas consultas no me trae datos entonces al no traerme respuesta al hacer esto: ROUND(SUM(reg.porcentaje)/11,0) ya no seria por las 11 sino por las que haya encontrado respuesta
No se si me explico?
Supongamos que de las 11 encontro respuesta solo en 4 entonces en vez de 11 colocar 4 ROUND(SUM(reg.porcentaje)/4,0)
Saque la data de la base de datos y lo lleve a una tabla dinamica en excel y ese fue el resultado
Y esa es la respuesta cuando ejecuto la consulta mysql a mostrar el grafico
 
no entiendo tu duda...
vos queres saber cuantas de esas consultas dieron resultados, para no hardcodear el 11?
 
Mi duda que tengo es que no encuentro como hacer que en vez de que sea 11 colocar el numero de veces que haya resultado si por ejemplo para las 11 query encontro solo 5 colocar en el round el 5 para poder sacar el porcentaje bien
Exacto para que asi solo saque el porcentaje de las consultas con respuesta y asi no tomar siempre las 11
 
2:56 PM
esas consultas devuelven 1 registro o mas de 1 registro?
 
en sql server, para convertir un getDate en datetime sirve con CAST(GETDATE() AS datetime)?
 
@NicolasOñate lo probaste?
 
y se que devuelve un datetiem
@gbianchi medio si
 
@gbianchi Devuelve muchos registros que se agrupar por fecha y hora
 
GETDATE me dice sintaxis incorrecta
nada ya lo tengo
 
3:16 PM
@abulafia hola lo que pasa es que necessito usar lambda
 
@JuanPerez bueno hace asi...
no se me ocurre como marcarlas.. para contarlas despues
podrias poner un 1 fijo en cada salida... pero no se que pasa con las que no devulven nada, si en ese caso no empezarian a devolver...
que pasa si hardcordeas un 1 en cada consulta y luego dividis por la suma de esa columna?
 
te refieres hacerlo consulta por separado?
 
@abulafia para que te sangren los ojos:
0
Q: unindent does not match any outer intendation level

Ignacio Zañartu Höppneral intentar correr el codigo me da el error "unindent does not match any outer intendation level" no entiendo en que falla el codigo :( es para un trabajo de la uni, entiendo los fundamentos y todo pero no logro entender en que esta fallando mi codigo el codigo es: ingreso: print("Ingreso: ") bor...

 
@JuanPerez nop.. que agregues algo que te marque cuales devuelven algo y cuales no.. de forma tal de poder contar la cantidad de querys que devolvieron algo...
 
las que no me devulven nada solo null
sin datos
 
3:32 PM
@JuanPerez pero la consulta devuelve registros con fecha y null en la cantidad?
o ni devuelve registros con fecha?
 
no, no devulve nada ningun registro
 
entonces tal vez te convenga agrupar 2 veces? en una haces solo el sum, y luego volves a agrupar por lo mismo y a ese sum anterior, lo dividis por el count de lo que dio?
 
3:45 PM
Hay me perdi
 
@JuanPerez y yo no puedo ayudarte mucho mas poruqe en este caso, es mas manos a la obra a ver como resolver eso...
y la idea era de alguna forma contar los querys que devolvieron algo... con un numero o algo..ç
 
@MauricioContreras entiendo los fundamentos, dice. Será de como funciona un teclado, porque lo que es de python ...
 
@MauricioContreras Dios, me costo un monton responder esa pregunta xD Pareciera que se equivocó de lenguaje de programacion!
Jamás vi que alguien cometiera tantos errores
y al principio, encima el código lo paso como imagen xD
El colmo de una pregunta
 
4:08 PM
Buenas!
 
Buenas c:
 
@x-rw ¿Y eso por qué? Es algún ejercicio y te ponen ese requisito en el enunciado? En ese caso mejor me compartes el enunciado, a ver qué se supone que tiene que hacer esa lambda, porque la verdad es que es imposible escribir una lambda que te devuelva si un número dado es primo o no
 
@abulafia mira algo asi
primes = range(2, 20)
for i in range(2, 8):
primes = filter(lambda x: x == i or x % i, primes)
print(primes)
 
@MauricioContreras Me quieres mal
Ah, parece una especie de criba de eratóstenes
la lambda no te dice si un número es primo o no, sólo si un número es x es múltiplo de otro i
y usas ese test para "tachar" de una lista todos los que sean múltiplos
 
@DanteS. uf, esta feo todo eso xd... asi era yo al inicio JAJA, habria que recomendarlo estudiar las bases:')
 
4:13 PM
@LogicaMiau esta bien que programe asi, despues es que uno mejora el gusto por la programacion, si miramos un codigo de nosotros del pasado obviamente no vamos a estar orgullosos
te aseguro que el maestro de las serpiente tiene codigo que gustaria poner en una pregunta/respuesta
 
@abulafia si si la verdad que si
 
primes = range(2, 20)
for i in range(2, 8):
  primes = list(filter(lambda x: x==i or x % i, primes))
print(primes)
 
@LogicaMiau Puedes recomendarselo tu mismo!
 
ya falta poco para mis 7K
la verdad ha sido duro :(
 
Felicidades!!!
 
4:17 PM
@DanteS. tengo una duda
 
Dime!
 
no, vi mal
 
Por curiosidad, que creiste???
 
pense que estabas pidiendo el año por la consola y te iba a decir que eso es string y no entero
 
@DanteS. eso hice! XD
@JackNavaRow cierto, cierto... la cosa es seguirle dando con animo
 
4:19 PM
Estado in ('C', 'c') => por oprimizacion @abulafia no es mejor hacer el upper?
bueno capaz dira que tantos if innecesarios
 
@JackNavaRow Es difícil saber qué es más rápido, si buscar una cadena en una lista de dos elementos, o si pasar a mayúsculas una cadena y luego comparar...
 
bueno, total es un elemento
 
la última palabra la tiene la experimentación
 
Segun este codigo
import timeit

def metodo1():
"a" in ("A", "a")

def metodo2():
"a".lower() == "a"

print(timeit.timeit(metodo1))
print(timeit.timeit(metodo2))
 
Y el ganador es... (redoble)
 
4:22 PM
es más rapido el primero!
xD
 
@abulafia upper?
 
"a" in ('A', 'a')
casi la mitad de tiempo
 
waaaaao!!
 
69 ns frente a 126 ns
las llamadas a funciones y métodos imponen bastante sobrecarga en python
 
@abulafia no me lo esperaba, tu te lo esperabas?
 
4:23 PM
pues en cierto modo sí
in es un "builtin" que no requiere llamadas a funciones
 
pero tanto tiempo?
 
yo estaba totalmente errado, pensaba que seria mas lento xd
 
hablando en mitad de tiempo me parece muy representativo
 
Si, llamar a un método requiere que el intérprete cree un marco de pila, que en python existe en el heap, por tanto un malloc() y posterior free()
y tenemos nuevo ganador con récord de 45 ns
a alguien se le ocurre?
 
uff
 
4:25 PM
@abulafia uhmmm, entonces si llamamos por segunda vez el tiempo cambia?
 
@JackNavaRow no entiendo, por segunda vez? por qué iba a cambiar el tiempo?
 
"a" in "Aa"?
 
@DanteS. Bingo!
 
con algun ciclo?
:0
 
Increible!
 
4:25 PM
ejemplo.... upper("a") == "A" && upper("b") == "B"
 
evitamos crear una segunda cadena y una tupla
@JackNavaRow Ahi tienes dos llamadas a upper, así que más tiempo. Cada llamada crea su propio marco
 
aunque la diferencia no es muy grande
 
aparte que sería "a".upper() == "A" and "b".upper() == "B", pero bueno, ya te había entendido
 
@abulafia pense que al estar en memoria el segundo deberia ser mas rapido
 
estar en memoria el qué?
 
4:27 PM
@abulafia tengo tiempo sin programar en python , y generlamente lo veo todo como programacion funcional
pero como lo muestras es distinto
 
lo que es el código de la función upper() ya estaba en memoria desde el principio
pero cada llamada a ese código debe crear un nuevo marco de pila, para el parámetro (que será diferente cada vez) y para las variables internas que pueda tener esa función
 
@abulafia al ver como se llama si se que es diferente
 
ese es el limite no?
ya no se puede reducir mas
 
El módulo dis muestra el "assembler" de un código python cualquiera. Es útil para entender asuntos de performance
 
esa pregunta es de evaluacion psicologica que te ponen
tienen variaciones, pero si, es una prueba psicologica
 
4:31 PM
c.lower() == "a"
---
  1           0 LOAD_NAME                0 (c)
              2 LOAD_METHOD              1 (lower)
              4 CALL_METHOD              0
              6 LOAD_CONST               0 ('a')
              8 COMPARE_OP               2 (==)
             10 RETURN_VALUE
c in ("a", "A")
---
  1           0 LOAD_NAME                0 (c)
              2 LOAD_CONST               0 (('a', 'A'))
              4 COMPARE_OP               6 (in)
              6 RETURN_VALUE
c in "aA"
---
  1           0 LOAD_NAME                0 (c)
              2 LOAD_CONST               0 ('aA')
              4 COMPARE_OP               6 (in)
              6 RETURN_VALUE
 
Interesante!
 
como ves la primera versión contiene un CALL_METHOD y las otras dos no
 
@abulafia y LOAD_METHOD
asombroso
 
si, pero ese LOAD_METHOD simplemente pone el símbolo lower encima de la pila de ejecución (o sea, el puntero a la función)
el intérperte usa una arquitectura de pila. Primero pone en la pila los operandos y luego realiza una operación con ellos.
 
@abulafia -.- esa es tu serpiente bajo la manga?
 
4:34 PM
CALL_METHOD llama a la función cuya dirección está en la cima de la pila (lower) pasándole los parámetros que están después en la pila (c)
el resultado de esa llamada queda otra vez en la pila
después se pone encima de la pila la constante 'a' y se ejecuta la copmaración ==, que compara los dos elementos encima de la pila
 
+1 al usuario que pregunto
 
que serán 'a' y el valor retornado por lower()
@JackNavaRow Que preguntó qué? Era esto una pregunta de un usuario?
 
@abulafia no, fue mia, pero el me ayudo a preguntar
 
@JackNavaRow No, raras veces uso dis. Aunque a veces sí que uso timeit para medir tiempos de ejecución
de todas formas, el que la solución in sea más rápida, depende de la longitud de elementos contra los que nos queramos comparar
por ejemplo x in ("Hola", "HOLA", "hola", "HoLa", "HoLA", "hOLA", "hoLA") podría ser más lenta que x.lower() == "hola"
Efectivamente, verificado
 
@abulafia pero para los estados en el ejemplo seria conveniente in (supongo) ejemplo x in("AaBbCc)
 
4:39 PM
la solución con lower sigue tardando unos 124 ns, mientras que la solución con in tarda ahora 128ns
 
@abulafia igual estan cercanos
 
@JackNavaRow En un caso así sí lo veo mejor, pues si encima no comparas con un solo valor sino con varios mediante un or, la solución con .lower() requerirá varias llamadas
y si la lista "AaBbCcDd" es muy larga, quizás interese covertirla a conjunto. Especialmente si la verificación x in valores_validos vas a tener que hacerla muchas veces en un bucle
en ese caso puedes convertir valores_validos en un set() antes de entrar al bucle de comprobación
porque buscar en un conjunto es mucho más rápido que buscar en una cadena
(aunque construir el conjunto requiere también su tiempo, por eso solo compensa si el conjunto lo creas fuera del bucle)
 
@abulafia pero esa solucion del set es interesantes solo preguntas si esta dentro del set y debe ser muy rapido
 
responder si está o no en el set es muy rápido, sí
pero construir el set es lento
entonces if x in set("AaBbCcDdEeFf") no compensa
porque hay que crear el conjunto antes de poder responder si x está en él
crear el conjunto implica recorreer todos los elementos de la cadena "AaBbCcDdEeFf"
pero puede ser útil en un caso cmo el siguiente:
validos = set("AaBbCcDdEeFf")
for i in range(100):
  x in validos
aqui el conjunto se crea una sola vez (tarda su tiempo), pero luego el test de si x está en él se hace 100 veces, por lo que ha compensado el tiempo que perdimos creándolo
5.5 µs tarda el código completo (creación del set y 100 iteraciones de pertenencia)
lo que es ligeramente mejor que este otro caso que usa una cadena en vez de un set
validos = "AaBbCcDdEeFf"
for i in range(100):
  x in validos
5.83 µs
La diferencia compensa más cuantas más veces se repita el bucle con el test
 
los tiempos son casi iguales
 
4:47 PM
y cuanto más larga sea la lista de "validos"
Sí, estos detalles de rendimiento no suelen ser normalmente muy relevantes. Yo nunca me preocupo de estas cosas cuando estoy desarrollando. Sólo si al final el tiempo total de un algoritmo es excesivo, hago un profiling para descubrir qué operaciones son las que se están comiendo el mayor porcentaje de tiempo, para centrarme en optimizar esas
optimizar todo desde el principio es una mala idea. Ya lo dijo Knuth
 
es verdad ley universal "Primero que funcione"
 
Jellou
@JackNavaRow y la segunda ley: si funciona, no lo toques
 
@MauricioContreras xD
 

« first day (1992 days earlier)      last day (1101 days later) »