非常に頻繁に呼び出されるコードから関数を高速化したいと考えています。この関数は、文字列の入力リスト (通常は長さ 4) を受け取り、入力文字列の英数字の順序に対応する順序で、対応するエントリが大文字に置き換えられた文字列のリストを生成します。次に、このリストが 1 つの文字列に結合されます。例: 入力リスト['wwTv', 'NzkT', 'wwTv', 'JhXc']
、出力文字列'C,B,C,A'
。実際の例では、各リストに多くの重複があります。
この特定の問題のより効果的な解決策を提案できますか? または、私の単純なアルゴリズムは十分に優れており、大幅に改善することはできませんか?
以下は私のコードのサンプルです(Python 3.2)。ここでは、入力データのサンプルがランダムに作成され、関数に渡されますf
。
import timeit
import string, random
dumb_label_set = ['A', 'B', 'C', 'D', 'E']
def a(labels):
uniq_labels = sorted(set(labels))
dumb_labels = [dumb_label_set[uniq_labels.index(a)] for a in labels]
s_name = ','.join(dumb_labels)
return(s_name)
def b(labels):
uniq_labels = {l: i for i, l in enumerate(sorted(set(labels)))}
dumb_labels = [dumb_label_set[uniq_labels[a]] for a in labels]
s_name = ','.join(dumb_labels)
return(s_name)
labels = []
for i1 in range(100000):
labels.append([''.join(random.choice(string.ascii_letters) for ii in range(random.randint(1,4))) for i2 in range(4)])
start = timeit.default_timer()
res_a = [a(l) for l in labels]
print(timeit.default_timer() - start)
start = timeit.default_timer()
res_b = [b(l) for l in labels]
print(timeit.default_timer() - start)
print(res_a == res_b)
結果:
0.41835449560994675
0.4420497451417873
True
私の関数a
は少し速く、b
Martijn Pieters によって提案されました