You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python 3.8下基于psutil的进程信息采集代码:能否通过列表推导式优化循环执行效率?

把psutil进程循环改成列表推导式的方法

当然可以!把这段代码改成列表推导式不仅能让代码更简洁,还能借助Python列表推导的底层优化带来一点性能提升,同时完全保留oneshot()减少系统调用的核心优势。

改写后的代码方案

方案1:用辅助函数(可读性优先)

如果追求代码的可读性,推荐写一个简单的辅助函数来封装oneshot()的逻辑,然后用列表推导调用它:

import psutil

def get_process_data(p):
    with p.oneshot():
        return [p.name(), p.pid]

list1 = [get_process_data(p) for p in psutil.process_iter()]

方案2:纯列表推导(简洁优先)

如果想完全用列表推导实现,不需要额外函数,可以利用生成器表达式来触发oneshot()上下文:

import psutil

list1 = [
    proc_info
    for p in psutil.process_iter()
    for proc_info in ([p.name(), p.pid] for _ in (p.oneshot(),))
]

关于性能的说明

  • 列表推导本身比手动for循环+append()的方式略快,因为它是Python底层优化过的构造,减少了字节码层面的操作。
  • 但真正影响这个场景性能的核心还是oneshot():它能让你在访问进程的多个属性(这里是name()pid)时,只做一次系统调用,而不是每次访问属性都调用一次系统接口——这才是提升效率的关键,两种改写方案都完整保留了这个优化。

另外要注意,Python 3.8的环境完全支持这两种写法,没有兼容性问题。

内容的提问来源于stack exchange,提问作者codecode1985

火山引擎 最新活动