我想从我的代码中加速该函数,该代码被非常频繁地调用。此函数接收字符串的输入列表(通常长度为 4)并生成字符串列表,其中对应的条目替换为大写字母,顺序对应于输入字符串的字母数字顺序。然后这个列表组合成一个字符串。示例:输入列表['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 提出