Как я могу сделать эту программу быстрее? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать программу, в которой пользователь вводит два числа - основание и показатель степени, а показатель степени - двоичное число. Затем распечатывает последние две цифры. Мой код работает хорошо, но в зависимости от времени выполнения это не самый быстрый способ сделать это.

Это мой код:

base = int(input())
exponent = int(input())

def binaryToDec(binary): 
    decimal, i = 0, 0
    while(binary != 0): 
        dec = binary % 10
        decimal = decimal + dec * pow(2, i) 
        binary = binary//10
        i += 1
    return decimal
exponent = binaryToDec(exponent)
result = base ** exponent
result = abs(result)%100
print(result)

Например, выходные данные 3 и 1010 должны быть 49.

Другой пример: Input:111111111111111111111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111111111111111

Вывод: 31

Я ожидаю, что при этом программа будет работать быстрее, как я могу это сделать?

1 Ответ

0 голосов
/ 24 октября 2019

Найдено следующее ускорение.

Отправленный метод

def binaryToDec(binary): 
    decimal, i = 0, 0
    while(binary != 0): 
        dec = binary % 10
        decimal = decimal + dec * pow(2, i) 
        binary = binary//10
        i += 1
    return decimal

Модифицированный метод (альтернатива использованию pow (2, i))

def binaryToDec_modified(binary): 
    decimal, i, p = 0, 0, 1          # modification
    while(binary != 0): 
        dec = binary % 10
        binary = binary//10
        decimal = decimal + dec * p  # modification
        p <<= 1
        i += 1
    return decimal

* Время (~ 73% быстрее) *

n = 100010001101001 # (15 digits)

%timeit binaryToDec(n)
100000 loops, best of 3: 15.6 µs per loop

%timeit binaryToDec_modified(n)
100000 loops, best of 3: 9.03 µs per loop
...