Я предложил щедрость, потому что я хотел бы знать, действительно ли это лучший способ сделать это. Тем не менее, я также пишу парсер, и поэтому мне нужна эта функциональность, и это то, что я придумал.
Модуль warnings
именно то, что вы хотите.
Сначала меня отвратило то, что каждый пример предупреждения, используемого в документах, выглядит как этих :
Traceback (most recent call last):
File "warnings_warn_raise.py", line 15, in
warnings.warn('This is a warning message')
UserWarning: This is a warning message
... что нежелательно, потому что я не хочу, чтобы он был UserWarning
, мне нужно собственное собственное имя предупреждения.
Вот решение этого:
import warnings
class AmbiguousStatementWarning(Warning):
pass
def x():
warnings.warn("unable to parse statement syntax",
AmbiguousStatementWarning, stacklevel=3)
print("after warning")
def x_caller():
x()
x_caller()
, который дает:
$ python3 warntest.py
warntest.py:12: AmbiguousStatementWarning: unable to parse statement syntax
x_caller()
after warning
Начиная с .NET 4.0 вы можете использовать класс System.Numerics.BigInteger. См. Документацию здесь: http://msdn.microsoft.com/en-us/library/system.numerics.biginteger (v = vs.110) .aspx
Другой альтернативой является IntX класс.
IntX - произвольная точность библиотека целых чисел, написанная на чистом C # 2.0 с быстрым - O (N * log N) - алгоритмы умножения / деления реализация. Это обеспечивает все основные операции над целыми числами, такими как сложение, умножение, сравнение, сдвиг по битам и т. д.
См. ответы в этом поток . Необходимо будет использовать одну из сторонних крупных целочисленных доступных библиотек/классов или ожидать C# 4.0, который будет включать собственный тип данных BigInteger.
Я использовал Biginteger в предыдущем задании. Я не знаю, какие потребности производительности Вы имеете. Я не использовал его в интенсивной производительностью ситуации, но никогда не имел проблем с ним.
Это не поможет Вам, но там, как предполагалось, было классом BigInteger в.Net 3.5; это было сокращено, но от операторов, сделанных в PDC, это будет в.Net 4.0. Они, по-видимому, провели много времени, оптимизировав его, таким образом, производительность должна быть намного лучше, чем, что Вы получаете теперь.
Далее, этим вопросом является по существу дубликат , Как я могу представить очень большое целое число в.NET?
Это может походить на странное предложение, но Вы протестировали десятичное число тип, чтобы видеть, как быстро это работает?
десятичный диапазон является В±1.0 Г — 10^в€ ’28 к В±7.9 Г — 10^28, таким образом, это все еще не может быть достаточно большим, но это больше, чем ulong.
Там, как предполагалось, был классом BigInteger в.NET 3.5, но она была сокращена .
Я не уверен в производительности, но IronPython также имеет класс BigInteger. Это находится в Microsoft. Сценарии. Математическое пространство имен.
Да, это будет медленно, и 10x, различие о том, что я ожидал бы. BigInt использует массив для представления произвольной длины, и все операции должны быть сделаны вручную (в противоположность большей части математики, которая может быть сделана непосредственно с ЦП)
, я даже не знаю, если кодирование руки, он в блоке даст Вам большую часть увеличения производительности по 10x, это довольно чертовски близко. Я искал бы другие способы оптимизировать его - иногда в зависимости от Вашей математической проблемы существуют небольшие приемы, которые можно сделать для создания этого более быстрым.
Я считаю, что Вы могли оптимизировать реализацию при выполнении всех операций на BigInts, которые собираются возвратить результаты, меньшие, чем собственный тип (Например, int64) на собственных типах и только иметь дело с большим массивом, если Вы собираетесь переполниться.
редактирование Этот реализация на codeproject, кажется только в 7 раз медленнее... Но с вышеупомянутой оптимизацией Вы могли заставить это работать почти тождественно к собственным типам для небольших чисел.
F#
также поставки с одной. Можно получить его в Microsoft.FSharp.Math
.
Here are several implementations of BigInteger in C#. Я использовал реализацию BigInteger Mono, работает довольно быстро (я использовал ее в CompactFramework)
Класс System.Numerics.BigInteger
в .NET 4.0 основан на Microsoft.SolverFoundation.Common.BigInteger
от Microsoft Research.
Класс Solver Foundation BigInteger
выглядит очень производительным.Я не уверен, под какой лицензией он выпущен, но вы можете получить его здесь (загрузите и установите Solver Foundation и найдите Microsoft. Solver.Foundation.dll).