PyCharm не грузит процессор

Рейтинг: 0Ответов: 1Опубликовано: 24.02.2023

В общем проблема такая, в PyCharm'е запускаю код, но он выполняется крайне медленно, процессор загружен всего на 15%+-, оперативки хватает, диски ссдшные, в общем по всем параметрам всё должно раз в 20 быстрее работать. В связи с этим вопрос, что я делаю не так? Или может какие-либо настройки нужно произвести? Как заставить PyCharm грузить железо на 100%?

Версия PyCharm:

PyCharm 2022.3 (Community Edition)
Build #PC-223.7571.203, built on November 30, 2022
Runtime version: 17.0.5+1-b653.14 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.

Вот код который я выполняю, в кратце, это сравнение сумм всех пар значений (я знаю что код так себе, если попутно подскажите как сделать его питоничнее, и почему именно так, буду признателен):

import itertools

with open('data/log_nov.txt', 'r') as file:
    File_Lines = file.readlines()
    Fl_Len = File_Lines.__len__()
    for Index in range(Fl_Len-14):
        Generate_name_Uniq = 'F:/py_database/Uniq' + Index.__str__() + '.txt'
        Name_Uniq = Generate_name_Uniq
        with open(Name_Uniq, 'w') as Uniq_file:
            El_array = []
            for i in range(15):
                for x in range(2, 6):
                    Line = File_Lines[Index+i].split('\t')
                    El = Line[x]
                    El_array.append(El)
            Par = list(itertools.combinations(El_array, 2))
            ParPar = list(itertools.combinations(Par, 2))
            bin_el = ''
            count_bin_block = 0
            for ParPar_El in ParPar:
                a = round(float(ParPar_El[0][0]) + float(ParPar_El[0][1]), 3)
                b = round(float(ParPar_El[1][0]) + float(ParPar_El[1][1]), 3)
                if a < b:
                    bin_el = bin_el + '11'
                    count_bin_block += 1
                if a > b:
                    bin_el = bin_el + '01'
                    count_bin_block += 1
                if a == b:
                    bin_el = bin_el + '00'
                    count_bin_block += 1
                if count_bin_block > 15:
                    n = int(bin_el, 2)
                    hex_el = hex(n)[2:]
                    Uniq_file.write(hex_el)
                    bin_el = ''
                    count_bin_block = 0
            fin_n = int(bin_el + '000000', 2)
            fin_hex_el = hex(fin_n)[2:]
            Uniq_file.write(fin_hex_el)

Диспетчер

Ответы

▲ 1

В общем, как и было сказано в комментарии выше, Python работает в монопотоке, верное решение этого вопроса, модуль multiprocessing.

Но, у меня пока мало опыта в написании программ, и вникание в подобные модули не быстрая история, а т.к. мне просто необходимы данные здесь и сейчас, решил немного другим, костыльным способом, реализовав multiprocessing мышкой. Сделал 8 дублей скрипта (у меня 8 лог.процесоров), разбил в каждом из них нагруженный цикл на 8 диапазонов, и запустил через shell 8 раз. В итоге получилось то, что мне нужно при минимуме усилий, но это конечно же не тру решение, и на постоянной основе так делать не стоит.