Python - как определить, связан ли процесс с вводом-выводом?

У меня есть программа, которая анализирует файл 100MB, затем я применяю некоторые функции к данным. Я не реализовал функции для проверки узкого места...

Поэтому я просто поместил свою реализацию в комментарий и просто поставил pass

ПОЧЕМУ python использует так много памяти?

Анализ файла занимает 15 минут, и я вижу, что python использует 3 ГБ памяти, процессор использует 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

person Hertha BSC fan    schedule 05.02.2017    source источник
comment
В зависимости от того, что вы пытаетесь сделать, вам может быть лучше использовать что-то вроде numpy np.loadtxt для быстрого чтения файла.   -  person VBB    schedule 05.02.2017


Ответы (2)


ваш код может быть значительно улучшен для скорости:

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]

(используя понимание спискового списка и понимание генератора, вплоть до передачи параметров в класс с распаковкой *)

person Jean-François Fabre    schedule 05.02.2017
comment
Спасибо, но теперь мне нужно создать новый объект в списке. newObj = (Jemand, 2); Как я могу добавить это в вашу команду? - person Hertha BSC fan; 05.02.2017
comment
Я редактирую свой вопрос, если вы могли бы помочь, я был бы признателен. - person Hertha BSC fan; 05.02.2017
comment
сначала вы изменили свой вопрос, затем вы создали переменную Rate, которую вы не сохраняете... и, наконец, вы задали другой вопрос. - person Jean-François Fabre; 05.02.2017
comment
Фабр, извини, я просто пытался понять понимание списка самостоятельно, но я новичок в python. У меня есть 3 переменные, которые мне нужно сохранить таким образом: L = [obj1T(objT2(var1, var2), var3), obj1T(objT2(var1, var2), var3))] - person Hertha BSC fan; 05.02.2017
comment
Функция редактирования вопроса @HerthaBSCfan присутствует в SO, чтобы предоставить OP возможность улучшить вопрос. Вы не должны менять контекст вопроса (можно сделать это, если на вопрос нет ответов). Потому что, когда вы редактируете контекст вопроса, текущие ответы, упомянутые на вопросы, становятся недействительными, и люди, которые предоставили ответы, будут получать отрицательные голоса за помощь вам (поскольку их ответ больше не решает проблему, упомянутую в вопросе) - person Anonymous; 05.02.2017
comment
@MoinuddinQuadri, извините, я выбрал его ответ как best, чтобы отметить, что это было здорово. Но после публикации мне понадобилось небольшое изменение, и я не могу заставить его работать с пониманием списка. Я пытаюсь снова сейчас. - person Hertha BSC fan; 05.02.2017
comment
SO — это вики для пользователей по всему миру. Просто пометить ответ как принятый - не очень хорошая идея, если вы изменили вопрос. Лучше спросить ответ о дальнейших проблемах, с которыми вы столкнулись (но не задавать их), или создать новый вопрос с проблемой, с которой вы столкнулись, и ссылкой на предыдущий вопрос, который вы задали. - person Anonymous; 05.02.2017
comment
@MoinuddinQuadri, понял. Я не буду ... я должен отредактировать вопрос в оригинале? - person Hertha BSC fan; 05.02.2017
comment
@HerthaBSCfan Я предлагаю откатить его до версии, для которой был опубликован этот ответ (чтобы Жан мог удалить вопрос был отредактирован с тех пор, что делает мой ответ недействительным из его ответа. Это не так. не очень хорошо смотрится в качестве первой строки любого ответа, не так ли? :) ) - person Anonymous; 05.02.2017
comment
@HerthaBSCfan Я все еще готов помочь. Во-первых, это работает достаточно быстро? если так, то это из-за listcomp, поэтому вы не можете разорвать цепочку, создав 2 объекта таким запутанным образом. Почему бы не создать 1 объект с 3 параметрами, и этот объект (Worker) создаст базовый Mensch в своем конструкторе. Это будет работать без изменения моего ответа, но с изменением параметров вашего конструктора объекта Worker. - person Jean-François Fabre; 05.02.2017

Наблюдаемая вами низкая производительность может быть вызвана ошибкой в ​​сборщике мусора Python. Чтобы решить эту проблему, отключите сборку мусора при построении списка и включите ее после завершения. Для получения дополнительной информации см. эту статью SO< /а>

person ivan_onys    schedule 05.02.2017