仍在玩推特趨勢。 我收集了足夠的數據,我想加快處理速度。 我想通過使用以趨勢詞為索引的關聯數組為每個趨勢詞分配一個整數索引。 下面介紹了三種向表中添加新詞或獲取舊詞索引的技術。
當單詞不在表中時,第一個使用 TRY 捕獲異常。 如果單詞存在則最快,如果發生異常則最慢(到目前為止)。
第二個使用 CONTAINS 來測試單詞是否存在,然後添加它或查找它。 添加速度最快,查找速度最慢(因為它會查找兩次。)
最後一個使用關聯數組默認值來查看檢索到的值是否已經存在。 它提供了一個不錯的折衷速度。
所有示例都有一個運行兩次的“t”循環。 第一次xN數組為空,必須填寫。 第二次所有值都已經存在。
// Three ways to build a lookup table. No clear winner!
// Goal: assign an integer, starting at 1, to each new
// entry. For timing purposes, use the integer as the
// key and the value. The key will be a string in real
// code. The value will be used as an index elsewhere.
explain = {"create new entry","use existing entry"};
N = 1e5; // several seconds at 1e5
/*
Use TRY to determine when an entry needs to be created.
On the "catch" create the entry. If there is no catch,
the value is already fetched. The "t" loop runs 20X
slower the first time because the "catch" is expensive.
But the second time the "t" loop is the fastest solution.
*/
x1 = [=> ];
For( t = 1, t <= 2, t += 1,
start = HP Time();
For( ix = 1, ix < N, ix += 1,
Try( y = x1[ix], y = (x1[ix] = ix) )
);
stop = HP Time();
Write( Eval Insert( "\!nTry method: ^char((stop - start)/1e6,5,3)^ seconds ^explain[t]^" ) );
);
/*
Use CONTAINS to determine if the entry needs to be created.
Use the if's "then" clause to fetch the existing index or
"else" clause to create a new entry. The "t" loop has the
fastest speed on the first run, by far, and the slowest
speed on the second run.
*/
x2 = [=> ];
For( t = 1, t <= 2, t += 1,
start = HP Time();
For( ix = 1, ix < N, ix += 1,
If( Contains( x2, ix ),
y = x2[ix],
y = (x2[ix] = ix)
)
);
stop = HP Time();
Write( Eval Insert( "\!nContains method: ^char((stop - start)/1e6,5,3)^ seconds ^explain[t]^" ) );
);
/*
Use a DEFAULT value to determine if the entry needs to be
created. Fetch the value for the entry, check for the default
and create if needed. This gives an between value for both
"t" loops. It might be a good compromise choice if no extra
testing will be done and 0 can be used as a default. !y,
below, is faster than y==0.
*/
x3 = [=> 0];
For( t = 1, t <= 2, t += 1,
start = HP Time();
For( ix = 1, ix < N, ix += 1,
y = x3[ix];
If( !y, y = (x3[ix] = ix) );
);
stop = HP Time();
Write( Eval Insert( "\!ndefault 0 method: ^char((stop - start)/1e6,5,3)^ seconds ^explain[t]^" ) );
);
// quick test... the lack of a default value in x1 and x2
// makes them compare not equal, so add it before testing.
x1 << setdefaultvalue( 0 );
x2 << setdefaultvalue( 0 );
Show( x1 == x2, x1 == x3 );
嘗試方法:2.851秒創建新條目
嘗試方法: 0.099秒使用現有條目
包含方法: 0.209秒創建新條目
包含方法:0.151 秒使用現有條目
默認 0 方法: 0.259秒創建新條目
默認 0 方法: 0.117秒使用現有條目
x1 == x2 = 1;
x1 == x3 = 1;
在紅色中,TRY 和 CONTAINS 為現有和新條目提供了最快的時間。 在綠色中,DEFAULT 0 可能是一個很好的折衷方案。 這實際上取決於將創建多少條目,以及它們將被查找多少次。