Компьютер тормозит и виснет что делать: Why your computer is so slow and how to fix it
Почему мой компьютер стал работать медленнее и перестал отвечать на запросы при запуске этой программы Python?
В Python вычисления в мире целых чисел обычно выполняются с произвольным размером. Таким образом, это означает, что если вы вычислите 2**1000000000
, он не будет делать это с 32-битным целым числом или 64-битным целым числом, но будет использовать long
в Python-2.x или . int
в Python-3.x (но int
в Python-3.x) имеет произвольный размер.
2**1000000000
, однако, огромное число. Для этого потребуется 1 000 000 000 бит или как минимум 125 000 000 байт. Он также будет рассчитывать мощность с использованием алгоритма и также должен представлять промежуточные результаты.
В CPython для хранения значения требуется 133 МБ памяти. Но это еще не все. Теперь вы хотите преобразовать это в строку. Строка займет примерно 301 029 995 цифр. Каждая цифра занимает не менее одного байта. Таким образом, это займет дополнительно 301 МБ памяти, кроме того, потребуется много работы для вычисления десятичного представления: на каждой итерации мы должны выполнять проверку по модулю 10, и, кроме того, нам нужно разделить число на 10, так что это работает (как минимум) квадратично по количеству цифр числа. Поскольку количество цифр огромно (~ 300 миллионов), это требует огромного объема работы.
Операция len(..)
не очень затратна, но описанные выше шаги требуют больших затрат как памяти (и немного времени процессора, особенно преобразования в строку). Память может показаться фактором, который мы можем игнорировать, но если мы потребляем огромное количество памяти, система может замедлиться или даже зависнуть. Обычно, если в системе заканчивается оперативная память, она начинает использовать подкачку памяти: она выгружает части оперативной памяти на жесткий диск, что очень медленно (по сравнению с оперативной памятью).
Описанный выше способ получения количества цифр определенно не является хорошим. Например, он не будет работать с отрицательными числами. Существует математическая концепция под названием логарифмов , и если вы возьмете log 10 числа, вы получите количество цифр минус один. Здесь есть некоторые дополнительные проблемы:
-
log10
отрицательных чисел не определить ; и - и не
log10
нуля.