【问题标题】:How to use/import a large dictionary without taking a massive performance hit?如何在不影响性能的情况下使用/导入大型字典?
【发布时间】:2020-12-16 19:27:23
【问题描述】:

我正在尝试使用这个 word list 我为一个不和谐的机器人找到了一个有点野心的刽子手游戏,如果我使用的是 Python,它建议使用文件的 .json 版本作为字典,我是。唯一的问题,它需要 forever 才能通过(解释?),大概是因为它有 370102 行,并且考虑到这将在树莓派上运行,这可能不会效果很好。

解决此问题的最佳方法是什么?我是 python 和一般编程的新手,所以我不太确定该怎么做。如果我在 C 中使用它会更快吗?也许我可以以某种方式使用数组?

它不必在字典中,只是文件是这样提供的。

【问题讨论】:

  • 您只需在脚本启动时支付该费用,一旦加载,您就可以快速访问它。还有,什么是“永远”?
  • 为什么需要是字典?您将什么与每个字典项相关联?
  • @RandomDavis 它需要快速键查找,a set,这通常用字典来实现。
  • @Schwern 为什么需要进行密钥查找?我认为列表会更快,因为您只需要一个扁平的单词列表,并在每一轮新一轮中随机抓取列表中的任何元素。如果您需要用单词存储任何信息,我可能会创建一个新字典来保存它,但仅用于已播放的单词,而不是所有单词的整个列表。
  • @Schwern Python set 类型;无需使用dict 进行模拟。

标签: python arrays c dictionary


【解决方案1】:

对于像字典查找这样基本的东西,将单词放入dbm file,然后从中读取。这可以有效地用作磁盘上的字典,让您快速查找键及其值,而无需将整个内容加载到内存中。

import dbm

with dbm.open('cache', 'r') as db:
  ...use db as a dictionary...

对于更复杂的事情,请使用独立的 SQL 数据库 SQLite


但是,作为RandomDavis points out,您不需要加载整个单词列表。你只需要在每场比赛中随机选择一个词。 This can be done in a single read of the file.

文件可以be compressed and still read line by line

看看它是否足够快以满足您的目的。如果不是,也许您可​​以运行一个线程,在他们处理第一个单词时在后台加载下一个单词。

【讨论】:

    【解决方案2】:

    在这种情况下,没有必要使用字典。您只是从列表中随机选择一个单词。如果您使用 github 存储库中的 words_alpha.txt 并将其作为列表导入,那么速度非常快:

    import random
    
    with open('words_alpha.txt') as words_file:
        words = words_file.read().splitlines()
    
    print(random.choice(words))
    

    以上在我的机器上花费了不到半秒的时间。 random.choice() 部分速度非常快,任何缓慢都将是只读文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 2012-04-20
      • 2020-07-29
      • 2011-01-19
      • 2013-10-06
      • 2021-04-10
      相关资源
      最近更新 更多