我正在尝试减少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
是一些耗时的功能之一。
在研究整整一周的代码后,我认为字典是这里数据结构的最佳选择,因为要更新的大量线程需要很多查找,但不明白为什么这段代码很昂贵。广泛的搜索未能启发。我无法理解curses
,socket
和struct
图书馆,因此无法提出一个自成一体的问题。我不是要求代码像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撰写更多文档字符串!)