Типичные примитивные типы .NET не имеют общего интерфейса, который позволяет использовать их для вычислений. Можно было бы определить ваши собственные интерфейсы (например, ISignedWholeNumber
), которые будут выполнять такие операции, определять структуры, которые содержат один Int16
, Int32
и т. Д., И реализовывать эти интерфейсы, а затем использовать методы, которые принимают общие типы ограничено ISignedWholeNumber
, но для преобразования числовых значений в типы структуры, вероятно, будет неприятность.
Альтернативным подходом было бы определить статический класс Int64Converter<T>
со статическим свойством bool Available {get;};
и статическим делегаты для Int64 GetInt64(T value)
, T FromInt64(Int64 value)
, bool TryStoreInt64(Int64 value, ref T dest)
. Конструктор класса может быть жестко закодирован для загрузки делегатов для известных типов и, возможно, использовать Reflection для проверки того, реализует ли тип T
методы с собственными именами и сигнатурами (в случае, если это что-то вроде структуры, которая содержит Int64
и представляет собой число, но имеет собственный метод ToString()
). Такой подход потеряет преимущества, связанные с проверкой типа времени компиляции, но все равно удастся избежать операций в боксе, и каждый тип нужно будет только «проверять» один раз. После этого операции, связанные с этим типом, будут заменены диспетчером делегатов.
Один из способов сделать это - использовать декоратор (PEP для декораторов) (первая из серии учебных статей по декораторам) . Вот пример, который делает то, что вы хотите.
from functools import wraps
from time import time
def timed(f):
@wraps(f)
def wrapper(*args, **kwds):
start = time()
result = f(*args, **kwds)
elapsed = time() - start
print "%s took %d time to finish" % (f.__name__, elapsed)
return result
return wrapper
Это пример его использования
@timed
def somefunction(countto):
for i in xrange(countto):
pass
return "Done"
Чтобы показать, как это работает, я вызвал функцию из приглашения Python:
>>> timedec.somefunction(10000000)
somefunction took 0 time to finish
'Done'
>>> timedec.somefunction(100000000)
somefunction took 2 time to finish
'Done'
>>> timedec.somefunction(1000000000)
somefunction took 22 time to finish
'Done'
Существует также timeit , который является частью стандартной библиотеки и действительно прост в использовании. Помните: не изобретайте велосипед!
Проверяли ли вы модуль «профиль» ?
Т.е. Вы уверены, что вам нужно реализовать свой собственный фреймворк вместо использования механизма профилирования по умолчанию для языка?
Вы также можете найти в Google "python hotshot" для аналогичного решения.