Le moyen le plus rapide d'éditer des listes de chaînesJ'essaie de filtrer une liste de listes de chaînes. Par exemple:
J'ai 2 listes, pour le filtre 1, j'aimerais concaténer les deux listes si la seconde liste ne correspond pas aux caractères de la première liste après la troisième. Ainsi, par exemple, "a3232", "32" violerait ceci, mais "a32323", "32" ne le ferait pas.
pour le filtre 2, j'aimerais supprimer les traits d'union (ou le caractère qui vous convient le mieux).
J'ai créé un exemple rapide de fonction qui renvoie la liste filtrée, mais dans le code réel, cela prend un certain temps.
Vous vous demandez si quelqu'un a eu de la chance de faire des choses similaires plus rapidement.
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);
J'ai envisagé de pré-préparer les sélections de filtres, mais à mesure que le nombre de filtres s'additionne, cela devient un problème grave et je m'inquiète du temps de démarrage.
Re: Le moyen le plus rapide pour éditer des listes de chaînesCe n’est pas vraiment un calcul, c’est plus un élément de l’interface graphique, donc la vitesse doit être rapide. Voici mes résultats quand je l'ai essayé.
L'exécuter avec une boucle dans JMP 13.1: 7.7 secondes
Exécution avec la table de données dans JMP 13 3,3 secondes
Exécution d'une boucle dans JMP 12.2: plus de 2 minutes
exécution avec table de données dans JMP 12.2: 3,5 secondes
Je ne sais pas comment vous avez eu une telle augmentation de vitesse avec la boucle.
Re: Le moyen le plus rapide pour éditer des listes de chaînesUn des avantages de parcourir les éléments d'une liste est que vous pouvez créer une fenêtre de dialogue indiquant la progression:

Les calculs lents sont beaucoup plus acceptables pour les utilisateurs quand ils savent combien de temps ils doivent attendre et quand ils ont la possibilité d’abandonner si le temps de traitement est plus long que prévu.
Re: Le moyen le plus rapide pour éditer des listes de chaînesJ'ai augmenté le nombre d'articles dans les listes à 1 million. La première méthode a pris 14 secondes, la seconde 7 secondes et la troisième 5 secondes. Il s’agit de la version 13, il semble donc qu’ils ont réussi à améliorer les performances des listes volumineuses.
Re: Le moyen le plus rapide pour éditer des listes de chaînesQuelle version de JMP utilisez-vous? Je sais que les listes ont été améliorées dans 13, mais j'ai une liste de 1 000 000 d'éléments, donc les faire dans une boucle for était très lente (je cours sous 12.2).
De plus, je dois faire tous les filtres en même temps, donc je dois créer mon expression de filtre d'abord dynamiquement, puis je dois l'évaluer.
Re: Le moyen le plus rapide pour éditer des listes de chaînesJe pense que la surabondance d’évaluations, etc., a rendu ce code difficile à comprendre, c’est pourquoi j’ai créé une version simplifiée.
Voici le code simplifié, en nous concentrant sur le deuxième filtre, en utilisant votre structure de codage:
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);
Sur mon ordinateur, le décalage horaire HP concerne 2000 .
Ensuite, j'ai réécrit le code pour éviter l'utilisation d'expressions et d'évaluation, 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);
Cela représente une amélioration des performances d'environ 25%, la différence de temps HP signalée étant ~ 1500 .
Les tables sont chères à utiliser, même si elles sont privées, voici donc du code qui ne les utilise pas:
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);
Le décalage horaire HP rapporté pour ce code est inférieur à 100 .