Как мне загрузить файл в Python эффективно, используя все мои возможности процессора? - PullRequest
0 голосов
/ 11 ноября 2018

Я решил создать код Python для шифрования моих данных некоторое время назад, когда я на полпути, я решил сделать тест производительности, и результат ужасен, как скорость шифрования всего 430 КБ / с. Открытие системного монитора показало, что моей программой используется только 1 поток моего процессора 8C16T.

После того, как я попытался временно удалить часть шифрования в моем коде, это было всего лишь на 10 КБ / с быстрее. Поэтому я проанализировал код и обнаружил эту часть кода

with open("10MB.test", 'rb') as f:  
    byte = f.read(1)
    if(i == 0):
        test = (str("".join([ch.encode("hex")  for line in byte for ch in line])))
        i = 1
        while byte != "":
            g = g + 1
            byte = f.read(1)
            a = str("".join([ch.encode("hex")  for line in byte for ch in line]))
            test = test + a

работает очень медленно, и системный монитор показывает, что он использует только одну нить моего процессора. Есть ли способ использовать все потоки моего процессора, чтобы сделать это быстрее?

import time
from datetime import datetime
realsr = ""
test = ""
i = 0
m = 0
g = 2
j = 0
ti1 = 0
ti2 = 0
ea = raw_input("Please Input Your First Password: ")
print "You Entered:",ea
eb = raw_input("Please Input Your Second Password: ")
print "You Entered:",eb
ec = raw_input("Please Input Your Third Password: ")
print "You Entered:",ec
ed = raw_input("Please Input Your Forth Password: ")
print "You Entered:",ed
ee = raw_input("Please Input Your Fifth Password: ")
print "You Entered:",ee
ef = raw_input("Please Input Your Sixth Password: ")
print "You Entered:",ef
eg = raw_input("Please Input Your Seventh Password: ")
print "You Entered:",eg
eh = raw_input("Please Input Your Eighth Password: ")
print "You Entered:",eh
ti1 = int(round(time.time() * 1000))
with open("10MB.test", 'rb') as d:
    j = len(str("".join([ch.encode("hex")  for line in d for ch in line])))
with open("10MB.test", 'rb') as f:  
byte = f.read(1)
if(i == 0):
    test = (str("".join([ch.encode("hex")  for line in byte for ch in line])))
    i = 1
while byte != "":
    g = g + 1
    byte = f.read(1)
    a = str("".join([ch.encode("hex")  for line in byte for ch in line]))
    test = test + a
    if(j != len(test)):
        temp1 = int(a,16)
        if(m == 0):
            temp1 * ea
        if(m == 1):
            temp1 * eb
        if(m == 2):
            temp1 * ec
        if(m == 3):
            temp1 * ed
        if(m == 4):
            temp1 * ee
        if(m == 5):
            temp1 * ef
        if(m == 6):
            temp1 * eg
        if(m == 7):
            temp1 * eh
while len(test) >= j:
    with open("clone.test", 'wb') as k:
        k.write(test.decode("hex"))
    ti2 = int(round(time.time() * 1000))
    print "done!"
    print test
    print (ti2-ti1)
    print ti1
    print (ti2)
    break

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Если вам нужен доступ ко всем ядрам вашего процессора, вам нужно использовать Pythons Многопроцессорный модуль .

И из документов;

В многопроцессорной обработке процессы порождаются созданием объекта Process. и затем вызывая его метод start (). Процесс следует API threading.Thread. Тривиальный пример многопроцессорной программы:

from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
0 голосов
/ 11 ноября 2018

Вместо использования "byte = f.read (1)" для загрузки 1 байта из файла используйте это:

content = f.read()
for byte in content:
    # your code

С помощью этого метода вы можете выиграть в быстром выполнении, потому что вы не прекращаете чтение между всеми байтами. Вы получаете доступ к файлу только один раз.

0 голосов
/ 11 ноября 2018

Вы читаете свой файл по одному байту за раз: f.read(1). Это ужасная идея. Вы должны прочитать столько, сколько можете безопасно поместить в память (возможно, весь файл, если позволяет объем памяти), а затем выполнить шифрование.

...