#python #python-3.x #performance #exponent
#python #python-3.x #Производительность #экспонента
Вопрос:
Я пытаюсь вычислить большие показатели из двух, такие как следующие: 2^48572234
(* примечание: это пример и не является одним из чисел, которые я вычисляю). Однако встроенная нотация python для повышения показателей довольно медленно справляется с этой задачей:
number = 2**<exponent>
Для выполнения этой задачи на моем компьютере требуется более 80 часов (используя приведенный выше пример). Однако может быть более быстрый метод pow
. Вот пример:
number = pow(<exponent>)
Это составляет до 68 часов. Но это все еще слишком долго, особенно когда показатели начинают становиться действительно большими. Другой способ сделать это — с math.pow
помощью функции, но она выдает ошибку OverflowError
.
Я также попробовал другой подход, когда я добавил n
количество единиц в строку, преобразовал ее в int
и добавил единицу, чтобы получить ответ. Это было бы похоже на следующий подход:
def genExponent(n): # generate large exponents of two.
x = ""
for i in range(n):
x = "1"
z = int(x,2)
z =1
return z
Однако этот подход работает так же медленно, как и другие, за 72 часа в моем примере.
У кого-нибудь есть идеи по более эффективным алгоритмам?
Комментарии:
1. Используя ваш пример,
2^48572234
это будет число, для хранения и представления которого потребуется приблизительно 48 мегабит / 6 мегабайт (2^X
требуютсяX 1
биты). На земле нет процессора, который мог бы вычислить такое число, используя аппаратное ускорение, поэтому это будет сделано только с помощью программного обеспечения. Поэтому неудивительно, что для вычисления требуется некоторое время.2. Однако, чтобы использовать это свойство, вероятно, было бы проще вычислить это обходным путем.
2^X
в двоичном формате 1, за которым следует X нулей, поэтому вместо математического вычисления другим подходом может быть построение этой строки, а затем ее анализ в (чрезвычайно большое) целое число.3. В вопросе, который я сказал, я пробовал это*
4. При таких размерах вам все равно следует рассмотреть возможность работы с представлением экспоненты. Что бы вы сделали с этим числом: добавьте 1 к результату? это не имело бы никакого эффекта.
5. Честно говоря, я действительно не хотел ничего с этим делать — Я просто хотел посмотреть, смогу ли я, и каким будет самый быстрый вариант его вычисления.
Ответ №1:
Вот шестнадцатеричный подход, который я описал в комментарии:
def hex(exponent):
sig_exp = exponent % 4
sig = 2**sig_exp
zeroes = (exponent - sig_exp) // 4
return str(sig) (zeroes * '0')
x = hex(1234567)
ix = int(x, 16)
# Equivalent exponential operator
# ix = 2*1234567
Кажется, что он работает достаточно быстро, хотя и не обязательно заметно быстрее, чем параметр оператора экспоненты (фактически, примерно то же самое). Я тестировал его только в онлайн-репозитории, которому не нравится, когда я пытаюсь создать строку / целое число размера, который вы описали в своем вопросе, поэтому я не знаю, как он там работает.