繁体   English   中英

对列表中所有项目传递功能的最快方法

[英]Fastest way to pass function on all items in list

我有一个大约50,000个单词的列表,我想在列表中的每个项目上传递一个函数。 然后,我想将原始单词另存为键,将翻译后的单词另存为字典中的值。 现在我知道我可以这样做:

translations = {word: translate(word) for word in word_list}

但是我认为这花费了太长时间。 有没有更快的方法可以做到这一点?

映射函数的工作速度应比dict理解速度更快:

translations = dict(zip(word_list, map(translate, word_list)))

这里发生的是:

  • 我们将函数应用于word_list每个元素,返回一个map对象
  • 将其组合为原始列表和该映射对象中的一对一元素元组的序列( zip对象)
  • 将结果序列转换成字典

设置测试程序后,似乎性能略有改善。 这是代码:

from datetime import datetime
def translate(wo):
    return wo.upper()

word_list = {str(i):str(i+1) for i in range(50000)}
d = datetime.now()
translations = dict(zip(word_list, map(translate, word_list)))
print(datetime.now() - d)
d = datetime.now()
translations = {word: translate(word) for word in word_list}
print(datetime.now() - d)

经过几次运行,第二个打印时间总是大于第一个,证明了效率。

如果您只需要很少的值,并且不会遍历该字典,则可以延迟进行尝试:

class MyDefaultDict(dict):
    def __init__(self, word_iterable, translate):
        self.word_set = frozenset(word_iterable)
        self.translate = translate
    def __missing__(self, key):
        if key in self.word_set:
            translated = translate(key)
            self[key] = translated
            return translated
        raise KeyError(key)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM