簡體   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