【问题标题】:Python fast dictionary creation with Pickle?用 Pickle 创建 Python 快速字典?
【发布时间】:2014-02-19 08:47:36
【问题描述】:

我正在尝试编写一个字谜服务。程序的第一阶段是遍历一个单词字典,并创建一个 Python 字典,其中包含单词长度的键和这些长度的单词的值,即:

def processedDictionary():
    d = defaultdict(list)
    f = open(dictionaryFile, "r")
    f.close()
    for line in lines:
        length = len(line)
        d[length].append(line)
    return d

这意味着字谜单词只需与相同长度的单词进行比较,processedDictionary()[length] 可以加快脚本速度。但是,我试图进一步优化脚本,因为每次有人对单词进行字谜时都必须“处理”字典是很愚蠢的,所以我每次都查看 pickle 来加载已经排序的字典:

def processedDictionary():
    file = open("dic.obj",'rb')
    object_file = pickle.load(file)
    file.close()
    return object_file

dic.obj 是已处理字典的 2MB 转储。然而,即使使用 cPickle,腌制字典的加载速度也是原始脚本的两倍!谁能建议我在这里缺少什么以及优化字典加载的正确途径是什么?

【问题讨论】:

  • 你运行的是哪个python版本?
  • Python 2.7。抱歉,总是忘记提及...
  • 不用担心,这在使用 Pickle 时尤为重要 :)

标签: python dictionary pickle


【解决方案1】:

当您转储数据时,请务必指定要使用的协议:

with open('dict.obj', 'wb') as fh:
    pickle.dump(obj, fh, pickle.HIGHEST_PROTOCOL)

加载时,如果您切换到 Python 3(如果可能),您应该会看到速度增加。

with open('dict.obj', 'rb') as fh:
    return pickle.load(fh)

还建议将腌制文件存储在单独的介质上。 因为从同一设备运行所有内容会减慢读取过程。

【讨论】:

  • 感谢 Torxed。使用最高协议的速度要快得多,但仍然只是边际改进。 PICKLED: (real 0m0.168s user 0m0.120s sys 0m0.032s) ORIGINAL: (real 0m0.175s user 0m0.140s sys 0m0.024s)
  • 你是说你的泡菜需要 0.168 秒才能完成吗?因为如果那是您正在使用的边缘..相比之下,它们是快速的。你必须考虑到它已经很快开始了,在这些级别上节省时间对于使用 Python 来说是非常复杂的。如果您假设在以“原始”格式读取字符串时必须对字符串进行更多计算,那么您会注意到一个巨大的改进,这就是 pickle 对您有用的时候。如果你有 1GB 的数据,你会节省一分钟左右,而 1GB 的数据也不算多:)
  • 谢谢。我怀疑。我只是觉得奇怪的是,解开字典所花费的时间与从头开始创建经过处理的 Python 字典所花费的时间相同。如果酸洗不能增加太多速度,那么值得使用吗?
  • 我想说酸洗在计算是时间因素的大型项目中非常有用。例如,[...](...) 对象之间的战斗非常有趣。 [...] 在您最多只有 5 个项目时很有用,之后 (...) 会好很多。如果你有超过 20 个对象 {...} 将是需要的。酸洗也是如此,它对较小的数据对象不是那么有用,因为打开文件,指示操作系统交出数据本身需要一点时间,然后你需要转换它。但一切都有它的时间和地点:)
  • 非常感谢 Torxed。我让服务器运行,它现在可以在 0.04 秒或更短的时间内运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多