La forma más rápida de editar listas de cadenasEstoy tratando de filtrar una lista de listas de cadenas. Como ejemplo:
Tengo 2 listas, para el filtro 1, me gustaría concatenar las dos listas si la 2ª lista no coincide con la primera lista de caracteres después de la tercera. Entonces, por ejemplo, "a3232", "32" violaría esto, pero "a32323", "32" no.
para el filtro 2 me gustaría eliminar los guiones (o cualquier personaje que se ajuste a su gusto).
He creado una función de ejemplo rápido que devuelve la lista filtrada, pero en código real esto lleva bastante tiempo.
Preguntándome si alguien ha tenido suerte haciendo cosas similares más rápido.
Names Default to here(1);
x = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
filterfunc = function({bothlists},
{DEFAULT LOCAL},
f = Expr(column(dt, "1")[]||column(dt, "2")[]);
dt = New Table("Test", private,
New Column("1", character, set values(bothlists[1])),
New Column("2", character, set values(bothlists[2])),
//New Column("First 3", character, Formula(Left(column(dt, "1")[], 3))),
New Column("Remainder", character, Formula(Right(column(dt, "1")[], length(column(dt, "1")[])-3))),
New Column("Filter", character ),
);
filter1 = 1; // filter to remove duplicates from of remainder
//after the first 3 of column 1 and the total of column 2
filter2 = 1; //filter to remove hyphens
if(filter1,
Substitute into(f,
Expr(column(dt, "2")[]),
Expr(if(Column(dt, "Remainder")[] != column(dt, "2")[],
column(dt, "2")[],
""
))
)
);
if(filter2,
Substitute into(f,
nameexpr(f),
EvalExpr(Substitute(Expr(nameexpr(f)), "-", ""))
)
);
Column(dt, "Filter") << Formula(nameexpr(f));
dt << Run Formulas;
values = Column(dt, "Filter") << Get Values;
close(dt, no save);
values;
);
st = HPTime(); //start of routine
filtered_stuff = filterfunc(x);
tot = HPTime() - st;
show(tot);
He pensado en hacer una selección previa de las selecciones de filtros, pero a medida que la cantidad de filtros se va sumando, esto se convierte en un problema de 2 ^ n, y me preocupa la hora de inicio.
Re: la manera más rápida de editar listas de cadenasEsto no es realmente un cálculo, es más un elemento gui, por lo que la velocidad debe ser rápida. Aquí están mis resultados cuando lo probé.
Ejecutándolo con un bucle en JMP 13.1: 7.7 segundos
Ejecutando con la tabla de datos en JMP 13 3.3 segundos
Corriendo con loop en JMP 12.2: 2+ minutos
corriendo con la tabla de datos en JMP 12.2: 3.5 segundos
No sé cómo conseguiste tal aumento de velocidad con el bucle.
Re: la manera más rápida de editar listas de cadenasUn punto positivo de iterar sobre los elementos de una lista es que puede construir una ventana de diálogo que muestre el progreso:

Los cálculos lentos son mucho más aceptables para los usuarios cuando saben cuánto tienen que esperar y cuando tienen la opción de abortar si el tiempo de finalización es más largo de lo previsto.
Re: la manera más rápida de editar listas de cadenasAumenté el número de artículos en las listas a 1 millón. El primer método tomó 14 segundos, el segundo método 7 segundos y el tercer método 5 segundos. Esto es con la versión 13, así que parece que han hecho un buen trabajo para mejorar el rendimiento de las listas grandes.
Re: la manera más rápida de editar listas de cadenas¿Qué versión de JMP estás usando? Sé que las listas se mejoraron en 13, pero tengo una lista de 1,000,000 de elementos, así que hacerlos en un bucle for fue realmente lento (estoy ejecutando 12.2).
Además, tengo que hacer todos los filtros simultáneamente, así que primero debo construir mi expresión de filtro dinámicamente y luego evaluarla.
Re: la manera más rápida de editar listas de cadenasCreo que la sobreabundancia de evals, etc. me ha hecho difícil entender este código, así que he creado una versión simplificada.
Aquí está el código simplificado, simplemente enfocándose en el segundo filtro, usando su estructura de codificación:
t1 = HpTime();
bothlists = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
dt = New Table("Test",Private,
New Column("1", character, Set Values(bothlists[1])),
New Column("2", character, Set Values(bothlists[2])),
New Column("Filter", character)
);
f = Expr(column(dt, "1")[]||column(dt, "2")[]);
Substitute into(f,
nameexpr(f),
EvalExpr(Substitute(Expr(nameexpr(f)), "-", ""))
);
Column(dt, "Filter") << Formula(nameexpr(f));
dt << Run Formulas;
values = Column(dt, "Filter") << Get Values;
t2 = HpTime();
show(t2-t1);
show(values);
En mi computadora la diferencia horaria de HP es sobre 2000 .
A continuación, reescribí el código para evitar el uso de expresiones y valores, etc.
t1 = HpTime();
bothlists = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
dt = New Table("Test", Private,
New Column("1", character, Set Values(bothlists[1])),
New Column("2", character, Set Values(bothlists[2])),
New Column("Filter", character)
);
Column(dt, "Filter") << Formula(
Substitute( :Name( "1" ) || :Name( "2" ), "-", "" )
);
dt << Run Formulas;
values = Column(dt, "Filter") << Get Values;
t2 = HpTime();
show(t2-t1);
show(values);
Esto tiene alrededor de un 25% de mejora en el rendimiento con la diferencia de TI reportada en HP ~ 1500 .
Las tablas son cosas caras de usar, incluso si son privadas, por lo que aquí hay un código que no las usa:
t1 = HpTime();
bothlists = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
lst = {};
For (i=1,i<=NItems(bothlists[1]),i++,
lst[i] = Substitute( bothlists[1][i] || bothlists[2][i], "-", "" )
);
t2 = HpTime();
show(t2-t1);
show(lst);
La diferencia horaria de HP reportada para este código es menor que 100 .