Магическое число прибывает из систем типов UNIX, где первые несколько байтов файла содержали маркер, указывающий на тип файла.
Python помещает подобный маркер в pyc
файлы, когда он создает их.
Затем интерпретатор Python удостоверяется, что это число корректно при загрузке его.
Что-либо, что повреждает это магическое число, вызовет Вашу проблему. Это включает редактирование pyc
файл или попытка работать pyc
от другой версии Python (обычно позже), чем Ваш интерпретатор.
, Если они Ваш pyc
файлы, просто удалите их и позвольте интерпретатору перекомпилировать эти py
файлы. В системах типов UNIX, которые могли быть чем-то столь же простым как:
rm *.pyc
или:
find . -name '*.pyc' -delete
, Если они не являются Вашими, необходимо будет или добраться эти py
файлы для перекомпиляции или интерпретатор, который может работать эти pyc
файлы с тем конкретным волшебным значением.
Одна вещь, которая могла бы вызывать неустойчивую природу. pyc
это вызывает проблему, может только быть импортирован при определенных условиях. Очень маловероятно, что это иногда импортировало бы. Необходимо ли проверить фактическое полное отслеживание стека, когда импорт перестал работать?
Как в стороне, первое слово весь моего 2.5.1(r251:54863)
pyc
файлы 62131
, 2.6.1(r261:67517)
62161
. Список всех магических чисел может быть найден в [1 116], воспроизведен здесь для полноты (текущий как, в то время, когда ответ был отправлен, это, возможно, изменилось с тех пор):
1.5: 20121
1.5.1: 20121
1.5.2: 20121
1.6: 50428
2.0: 50823
2.0.1: 50823
2.1: 60202
2.1.1: 60202
2.1.2: 60202
2.2: 60717
2.3a0: 62011
2.3a0: 62021
2.3a0: 62011
2.4a0: 62041
2.4a3: 62051
2.4b1: 62061
2.5a0: 62071
2.5a0: 62081
2.5a0: 62091
2.5a0: 62092
2.5b3: 62101
2.5b3: 62111
2.5c1: 62121
2.5c2: 62131
2.6a0: 62151
2.6a1: 62161
2.7a0: 62171
Если вы разрабатываете программу торговли с малой задержкой и действительно хотите конкурировать с с точки зрения задержки, то BigDecimal
не для вас , это так просто. В тех случаях, когда микросекунды имеют значение, создание объектов и любые десятичные вычисления слишком дороги.
Я бы сказал, что для почти всех остальных использование BigDecimal
не составит труда, потому что оно будет иметь небольшое видимое влияние на производительность приложений.
В системах с критичным временем задержки, принимающих торговые решения, любые непредсказуемые паузы при сборке мусора совершенно исключены, поэтому пока Алгоритмы сборки мусора великолепны при нормальном использовании, они не обязательно подходят, когда задержка в 5 миллисекунд может стоить вам больших денег.
BigDecimal
действительно имеет производительность намного ниже, чем, скажем, long
, double
или даже Long
. Будет ли это иметь существенное значение для производительности вашего приложения, зависит от вашего приложения.
Я предлагаю найти самую медленную часть вашего приложения и провести сравнительный тест. Это все еще достаточно быстро? Если нет, вы можете написать небольшой неизменяемый класс, содержащий единственный long
, возможно, проверяющий переполнение.
JVM в настоящее время довольно хороши с точки зрения обработки создания и уничтожения недолговечных объектов, так что это уже не то беспокойство, которое когда-то было.
Я бы порекомендовал построить макет того, что вы хотите сделать, и измерить это. Это будет стоить намного больше, чем любые «теоретические» ответы, которые вы можете получить: -)
Если посмотреть на вашу конкретную проблемную область, аналогичные системы, над которыми я работал в прошлом, работают очень хорошо, используя двойники для данных, которые вы хотите использовать BigDecimal для, и, возможно, стоит пересмотреть свое мышление в этой области. Беглый взгляд на BigDecimal показывает, что у него 5 или 6 полей,
Большой вопрос: действительно ли вам нужны десятичные вычисления произвольной точности? Если вычисления выполняются только для анализа данных и принятия решений на их основе, то артефакты округления и двоичного представления среди наименее значимых битов, вероятно, не имеют отношения к вам; просто используйте double
(и проанализируйте свои алгоритмы на числовую стабильность ).
Если вы действительно выполняете транзакции, в которых числа должны складываться, а точность имеет значение абсолютно, тогда двойной
не вариант. Возможно, вы сможете разделить эти две части своего приложения и использовать BigDecimal
только в части транзакции.
Если это невозможно, то вам в значительной степени не повезло. Вам понадобится математическая библиотека BCD , а я не Не думаю, что у Java есть такой. Вы можете попробовать написать свой собственный, но это потребует много работы, и результат все равно может оказаться неконкурентоспособным.
Я не уверен, каковы ваши требования, но обычно при выполнении финансовых расчетов нельзя допустить снижения точности, вызванного типами с плавающей запятой. Обычно при работе с деньгами точность и правильное округление важнее эффективности.
Если вам не нужно иметь дело с процентами и все суммы являются целыми числами, вы можете использовать целые типы (int, long или даже BigInteger) с одним значением 0,01 вашей денежной единицы.
И даже если вы думаете, что можете позволить себе точный удар с типом double
, возможно, стоит сначала попробовать с BigDecimal и проверить, действительно ли он тормозит для вас.