为什么这个字典更新代码速度慢?我怎样才能提高它的效率?

时间:2014-01-08 07:11:06

标签: python performance python-2.7 dictionary

我正在尝试减少python应用程序所消耗的处理器时间,在对其进行分析之后,我发现一小部分代码消耗的处理器时间比它应该多:

class Stats(DumpableObject):
    members_offsets = [
        ('blkio_delay_total', 40),
        ('swapin_delay_total', 56),
        ('read_bytes', 248),
        ('write_bytes', 256),
        ('cancelled_write_bytes', 264)
    ]

[...other code here...]

    def accumulate(self, other_stats, destination, coeff=1):
        """Update destination from operator(self, other_stats)"""
        dd = destination.__dict__
        sd = self.__dict__
        od = other_stats.__dict__
        for member, offset in Stats.members_offsets:
            dd[member] = sd[member] + coeff * od[member]

为什么这么贵?如何提高此代码的效率?

上下文:

我最喜欢的Linux工具之一iotop使用的处理器时间远远超过我认为适合监控工具的时间 - 快速消耗几分钟的处理器时间;使用内置的--profile选项,总函数调用接近400万运行仅20秒。我在其他系统上观察到类似的行为,重启,并且在多个内核上。 pycallgraph强调accumulate是一些耗时的功能之一。

在研究整整一周的代码后,我认为字典是这里数据结构的最佳选择,因为要更新的大量线程需要很多查找,但不明白为什么这段代码很昂贵。广泛的搜索未能启发。我无法理解cursessocketstruct图书馆,因此无法提出一个自成一体的问题。我不是要求代码像i7z中的纯C一样轻量级。

我发布图片&其他数据,但我没有声誉。

iotop git存储库:http://repo.or.cz/w/iotop.git/tree(相关代码位于data.py,第73行开头)

有问题的系统在具有2GB内存的Intel E6420上运行Ubuntu 13.04。内核3.8.0-35-generic。

(我希望Guillaume Chazarain撰写更多文档字符串!)

0 个答案:

没有答案