Поведение операторов Python ** и% с большими числами - PullRequest
1 голос
/ 10 августа 2011

Когда я вставил в интерпретатор Python a ** b% c с большими a (20 цифр) b (4 цифры) c (20 цифр), я увидел, что Python вычисляет его довольно быстро, почти как pow (a, b, c) ). Я ожидаю другого поведения, когда Python сначала вычислит **, а затем получит модуль (%) результата, и такой расчет займет значительно больше времени.

Где магия за сценой?

Ответы [ 4 ]

6 голосов
/ 10 августа 2011

Если вы вводите в интерпретатор Python что-то вроде:

20937505974095709374 ** 3438

Затем увидим пару секунд ожидания. Затем пытается:

20937505974095709374 ** 3438 % 6

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

4 голосов
/ 10 августа 2011

20 цифр на современном компьютере смехотворно малы. Попробуйте 2000 цифр, и вы можете увидеть разницу.

Кроме того, этот последний вопрос связан с: Как Python реализовал встроенную функцию pow ()?

2 голосов
/ 10 августа 2011

За кулисами нет магии, за исключением того, что Python поддерживает целые числа произвольной точности и хорошо реализован. Он действительно вычислил ** b, затем% c.

0 голосов
/ 10 августа 2011

Современные компьютеры удивительно быстрые, очень сложные вычисления могут происходить за мгновение. Вам нужно повторять такие вычисления очень много раз, чтобы увидеть задержку; Я бы начал с миллиона.

...