以最少计算成本的方式编译字典

时间:2013-02-01 15:02:12

标签: python dictionary

假设我有两个列表tokens_e_settokens_f_set,我想将两个元素中每个元素的每个可能组合映射为字典t_e_f中的键。每个键都必须具有1/len(tokens_e_set)的值。我正在寻找一种以最快的方式完成它的方法,因为我必须使用很长的令牌列表。代码如下:

init_value=1/len(tokens_e_set)
t_e_f=collection.defaultdict(float)
for word_e in tokens_e_set:
    for word_f in tokens_f_set:
        t_e_f[(word_e,word_f)]=init_value

谢谢!

2 个答案:

答案 0 :(得分:0)

使用product代替嵌套for循环。

由于您使用许多键初始化一个dict,所有键都具有相同的值,因此dict.fromkeys似乎是最好的方法。

from itertools import product
t_e_f = dict.fromkeys(product(tokens_e_set,tokens_f_set),1.0/len(tokens_e_set))

(作为OP的练习留下的比较时间。)

答案 1 :(得分:0)

比较时间:

C:\Python27>python lib\timeit.py -s "tokens_e_set=tokens_f_set=range(100)" -s "import collections" "t_e_f=collections.defaultdict(float);init_value=1/len(tokens_e_set)" "for word_e in tokens_e_set:" " for word_f in tokens_f_set:" "  t_e_f[word_e,word_f]=init_value"
100 loops, best of 3: 2.61 msec per loop

C:\Python27>python lib\timeit.py -s "tokens_e_set=tokens_f_set=range(100)" -s "from itertools import product" "t_e_f = dict.fromkeys(product(tokens_e_set,tokens_f_set),1.0/len(tokens_e_set))"
1000 loops, best of 3: 1.88 msec per loop

这些比例如何作为提问者的练习。