听写理解花费的时间比预期要长得多

问题描述 投票:0回答:2

我正在分析我的模拟代码,我注意到字典理解需要相当长的时间。

字典理解看起来像这样:


return {
  n : self.method(d) for n, d in zip(ns, ds)
}

self.method
占用了大约 40% 的调用,但这是预期的,因为这种方法很昂贵(它查询数据库),而根据“cProfile”,另外 60% 似乎来自 dict 理解调用的开销.

有没有更快的方法来写上面的内容?

我原以为听写理解所花费的时间可以忽略不计。

python dictionary dictionary-comprehension
2个回答
1
投票

有没有更快的方法来写上面的内容?

有可能,但很挑剔,也许并不值得。

根本问题可能是:

字典中的字典。外部字典可能大约有 ~5000 个键

生成的(理解)字典快速增长,Python 时常需要分配新的内存(也取决于 5000 个值的大小);也可能将旧数据洗牌到新的内存位置。如果你能找到一种预先分配内存的方法,那就会更快。但我不知道如何做到这一点,这并不是使用 Python 时的真正意图(内存分配对于用户/程序员来说应该是不可见的)。

优化具有 5000 个键的字典的字典(然后是内部字典)的情况表明,最好完全使用不同的数据类型。考虑使用 NumPy(重新数组或可能只是普通数组)或 Pandas。对于 Pandas,多重索引可能对嵌套字典很有用:多重索引将由几个(3,afaict)键层组成。然后,您可以预先计算总体大小,并一次性分配必要的内存,然后开始将值分配到数组或数据帧/系列中。总而言之,这会比您当前正在做的更快。


0
投票

您可以通过使用内置函数构建字典来减少 Python 代码量:

return dict(zip(ns,map(self.method,ds)))

我认为这不会产生很大的影响。

© www.soinside.com 2019 - 2024. All rights reserved.