【问题标题】:Python - how to tell if a process is i/o bound?Python - 如何判断一个进程是否是 i/o 绑定的?
【发布时间】:2017-06-22 08:35:25
【问题描述】:

我有一个解析100MB 文件的程序,然后我在数据上应用了一些函数。我没有实现检查瓶颈的功能...

所以我只是把我的实现放在评论中,然后把pass

为什么 python 使用这么多内存?

解析文件需要 15 分钟,我可以看到 python 正在使用 3GB 内存,CPU 使用率为 15%,内存使用率为 70%。

它是否应用程序是 io 绑定的?

如何加快解析速度?或者对慢解析没有什么可做的吗?

文件示例: 年龄和薪水

50 1000
40 123
1233 123213

代码:

def parse(pathToFile):
    myList = []
    with open(pathToFile) as f:
        for line in f:
            s = line.split()
            age, salary = [int(v) for v in s]
            Jemand = Mensch(age, salary)
            myList.append(Jemand)
    return myList

【问题讨论】:

  • 根据您要执行的操作,您最好使用类似numpynp.loadtxt 来快速读取文件。

标签: python python-2.7 parsing io


【解决方案1】:

您的代码可以大大提高速度:

with open(pathToFile) as f:
    for line in f:
        s = line.split()
        age, salary = [int(v) for v in s]
        Jemand = Mensch(age, salary)
        myList.append(Jemand)

很慢是因为

  • 循环
  • append
  • 无用的列表 comp 转换为整数,分配给固定数量的值

它可以变成一个准单线:

with open(pathToFile) as f:
    myList = [Mensch(*(int(x) for x in line.split())) for line in f]

(使用列表链式列表理解和生成器理解,只要将参数传递给具有* 解包的类)

【讨论】:

  • 谢谢,但现在我需要在列表中创建一个新对象。 newObj = (Jemand, 2);我怎样才能将这个添加到你的一个commnad?
  • 如果您能提供帮助,我会编辑我的问题。
  • 首先你改变了你的问题,然后你创建了一个不存储的Rate变量......最后你问了另一个问题。
  • Fabre,对不起,我只是想自己理解列表理解,但我是 python 新手。我有 3 个变量需要以这种方式存储:L = [obj1T(objT2(var1, var2), var3), obj1T(objT2(var1, var2), var3))]
  • @HerthaBSCfan 编辑问题功能存在于 SO 中,为 OP 提供改进问题的能力。您不应该更改问题的上下文(如果没有发布问题的答案,可以这样做)。因为当您编辑问题的上下文时,问题中提到的当前答案将变得无效,并且提供答案的人会因为帮助您而被否决(因为他们的答案不再解决问题中提到的问题)
【解决方案2】:

您观察到的性能不佳可能是由 Python 垃圾收集器中的错误引起的。要解决此问题,请在构建列表时禁用垃圾收集,并在完成后将其打开。更多详情见this SO article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 2011-02-21
    • 2010-10-13
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多