Python: Как мне преобразовать файл в пользовательский базовый номер и обратно? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть файл, который я хочу преобразовать в пользовательскую базу (например, базу 86 с пользовательским алфавитом)

Я пытаюсь преобразовать файл с помощью hexlify, а затем в свою базу данных, но это слишком медленно ... 8 секунд для 60 Ko ..

def HexToBase(Hexa, AlphabetList, OccurList, threshold=10):
    number = int(Hexa,16) #base 16 vers base 10
    alphabet = GetAlphabet(AlphabetList, OccurList, threshold)
    #GetAlphabet return a list of all chars that occurs more than threshold times

    b_nbr = len(alphabet) #get the base
    out = ''
    while number > 0:
        out = alphabet[(number % b_nbr)] + out
        number = number // b_nbr
    return out

file = open("File.jpg","rb")
binary_data = file.read()
HexToBase(binascii.hexlify(binary_data),['a','b'],[23,54])

Итак, кто-нибудь может помочь мне найти правильное решение?

Извините за мой плохой английский. Я француз, и спасибо за вашу помощь!

1 Ответ

0 голосов
/ 17 мая 2018

Сначала вы можете заменить:

int(binascii.hexlify(binary_data), 16) # timeit: 14.349809918712538

На:

int.from_bytes(binary_data, byteorder='little') # timeit: 3.3330371951720164

Во-вторых, вы можете использовать функцию divmod для ускорения цикла:

out = ""
while number > 0:
    number, m = divmod(number, b_nbr)
    out = alphabet[m] + out

# timeit: 3.8345545611298126 vs 7.472579440019706

Сравнение divmod против %, // и больших чисел см. Является ли divmod () быстрее, чем операторы% и //? .

(Примечание: я ожидал, что buildindмассив, а затем создание строки с "".join будет быстрее, чем out = ... + out, но с CPython 3.6 это было не так.)

Все, что было собрано, дало мне коэффициент ускорения 6.

...