Я работаю над проблемой программирования, когда мне нужно обрабатывать число, состоящее из 100000 цифр. Может ли python обрабатывать такие числа?Обработка больших чисел в коде
ответ
Конечно, это может:
>>> s = 10 ** 100000
Это, кажется, работает нормально:
>>> x = 10**100000
>>> x
10000000000000000000000000000000000000000000000000000000000000000000000000000000
[snip]
00000000L
Согласно http://docs.python.org/library/stdtypes.html, «Длинные целые имеют неограниченную точность», которая, вероятно, означает, что их размер не ограничен.
Да; Python 2.x имеет два типа целых чисел, int и longнеограниченный размер. Однако все вычисления автоматически преобразуются в длину, если необходимо. Обработка больших чисел отлично работает, но одна из самых медленных вещей будет, если вы попытаетесь напечатать 100000 цифр для вывода или даже попытаться создать из нее строку.
Если вам нужна произвольная десятичная точность с фиксированной точкой, есть десятичный модуль.
Как указано в других ответах, Python поддерживает целочисленные числа, ограниченные только объемом доступной памяти. Если вы хотите еще быстрее их поддержки, попробуйте gmpy (как автор gmpy и текущее сотрудничество сопровождающим Я конечно немного предвзято здесь ;-):
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x+1'
10000 loops, best of 3: 114 usec per loop
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y+1'
10000 loops, best of 3: 65.4 usec per loop
Как правило, арифметика не является узким местом для работы с такие числа (хотя непосредственная поддержка gmpy
для некоторых комбинаторных и теоретико-числовых функций может помочь, если это то, что вы делаете с такими числами). Включение числа в десятичной строки, вероятно, обычная операция, которая будет чувствовать себя медленный ...:
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(x)'
10 loops, best of 3: 3.11 sec per loop
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(y)'
10 loops, best of 3: 27.3 msec per loop
Как вы видите, даже в gmpy
stringification огромных чисел может быть в сотни раз медленнее, чем простое сложение (увы, это сложная операция!); но в исходном коде Python отношение времени может идти до строкой: десятки тысяч раз медленнее, чем простое дополнение, поэтому вы действительно хотите следить за этим, особенно если вы решили не загружать и устанавливать gmpy
(например, потому что вы не можете: например, gmpy в настоящее время не поддерживается в Google App Engine).
Наконец, промежуточный случай:
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x*x'
10 loops, best of 3: 90 msec per loop
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*y'
100 loops, best of 3: 5.63 msec per loop
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*x'
100 loops, best of 3: 8.4 msec per loop
Как вы видите, умножив два огромных числа в машинном коде Python может быть почти в 1000 раз медленнее, чем простое сложение, а с gmpy
замедление менее чем в 100 раз (и это не так уж плохо, даже если только один, если числа уже находятся в собственном формате gmpy
, так что есть накладные расходы на преобразование другого).
Спасибо за gmpy! Я использую его для курса криптографии на Coursera. –
GMPY2 поддерживает библиотеку GMP для целочисленной и рациональной арифметики, но GMPY2 добавляет поддержку многомерной точности и сложной арифметики, предоставляемой библиотеками MPFR и MPC. GMP (многоаспектная арифметическая библиотека GNU) стремится быть быстрее, чем любая другая библиотека bignum для всех размеров операндов. http://en.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library –
Как уже указывалось, Python может обрабатывать номера размером с памятью. Я хотел бы добавить, что по мере увеличения числа стоимость всех операций на них возрастает. Это не просто для печати/преобразования в строку (хотя это и есть самая медленная), добавляя два больших числа (больше того, что может обрабатывать ваше оборудование) больше не O (1).
Я просто упомянул об этом, отметив, что хотя Python аккуратно скрывает детали работы с большими числами, вам все равно нужно иметь в виду, что эти операции с большими числами не всегда похожи на операции с обычными ints.
- 1. Обработка очень больших чисел
- 2. C++ Обработка больших чисел
- 3. Создание больших чисел в коде
- 4. Обработка больших чисел в JavaScript
- 5. Обработка больших чисел в C++?
- 6. Обработка больших чисел и переполнения
- 7. Переполнение Math - обработка больших чисел
- 8. Обработка больших целых чисел в C++
- 9. Обработка «больших» целых чисел в C#
- 10. Обработка чисел, больших, чем Long в VBA
- 11. Обработка больших чисел с VPA в MATLAB
- 12. Проблема решета Эратосфена: обработка действительно больших чисел
- 13. Java Open Maple - обработка очень больших чисел
- 14. Обработка C++ очень больших целых чисел
- 15. Go, DER и обработка больших целых чисел
- 16. Любой способ форматирования больших чисел в коде для упрощения чтения?
- 17. Обработка больших чисел с точностью в Redis Lua
- 18. Обработка больших целых чисел в приложениях с малой задержкой
- 19. Обработка больших чисел в Python 3 для вычисления комбинации
- 20. Обработка больших целых чисел для цикла, оптимизированного в python
- 21. Обработка произвольно больших целых чисел в языке dbase
- 22. Обработка больших целых чисел в Java без использования BigInteger
- 23. Обработка больших входов в python
- 24. Обработка процессора в коде
- 25. Обработка больших файлов данных
- 26. Обработка больших объемов изображений
- 27. Обработка больших наборов данных
- 28. Обработка больших файлов
- 29. Обработка больших растровых изображений
- 30. Обработка больших файлов xml
Очень похоже: http://stackoverflow.com/questions/538551/handling-very-large-numbers-in-python –
В зависимости от того, что вы делаете с этими числами, вы можете рассмотреть их хранение как журнал (номер). – mpen