編輯字符串列表的最快方法我正在嘗試過濾字符串列表列表。 舉個例子:
我有2個列表,對於過濾器1,我想連接兩個列表iff第二個列表與第三個列表之後的第一個列表字符不匹配。 所以例如“a3232”,“32”會違反這個,但“a32323”,“32”不會。
對於過濾器2我想刪除連字符(或任何符合你喜歡的字符)。
我已經創建了一個快速示例函數,它返回已過濾的列表,但在實際代碼中,這需要相當長的時間。
想知道是否有人有運氣更快地做同樣的事情。
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);
我已經考慮過預製濾波器的選擇,但隨著濾波器數量的增加,這變成了我認為的2 ^ n問題,我擔心啟動時間。
Re:編輯字符串列表的最快方法這不是一個真正的計算,它更像是一個gui元素,因此速度需要很快。 這是我嘗試時的結果。
在JMP 13.1中使用循環運行它:7.7秒
在JMP 13中使用數據表運行3.3秒
在JMP 12.2中使用循環運行:2分鐘以上
在JMP 12.2中使用數據表運行:3.5秒
我不知道你是如何通過循環提高速度的。
Re:編輯字符串列表的最快方法迭代列表中項目的一個優點是,您可以構建一個顯示進度的對話框窗口:

如果用戶知道他們需要等待多長時間,並且如果完成時間比他們預期的要長,他們可以選擇中止,則用戶可以更慢地接受緩慢的計算。
Re:編輯字符串列表的最快方法我將列表中的項目數量增加到100萬。 第一種方法需要14秒,第二種方法需要7秒,第三種方法需要5秒。 這是版本13,所以看起來他們在提高大型列表的性能方面做得很好。
Re:編輯字符串列表的最快方法您使用的是哪個版本的JMP?我知道列表在13中得到了增強,但是我有一個1,000,000個項目的列表所以在for循環中執行它們的速度非常慢(我運行的是12.2)。
此外,我必須同時執行所有過濾器,所以我必須首先動態構建我的過濾器表達式然後我必須評估它。
Re:編輯字符串列表的最快方法我認為過多的evals等讓我很難理解這段代碼,所以我創建了一個簡化版本。
這是簡化的代碼,只關注第二個過濾器,使用您的編碼結構:
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);
在我的電腦上,惠普時差就是這樣 2000 。
接下來,我重寫了代碼以避免使用表達式和evals等:
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);
報告的HP TIme差異為〜時,性能提升約25% 1500 。
表是昂貴的東西,即使是私有的,所以這裡有一些不使用它們的代碼:
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);
此代碼報告的HP時差小於 100 。