Я написал сообщение в блоге об этом, посмотрите его:
http://www.nimrodstech.com/scala-map-merge/
в основном используя полугруппу скалазов, вы можете достичь этого довольно легко
будет выглядеть примерно так:
import scalaz.Scalaz._
Map1 |+| Map2
Вместо написания собственного кода профилирования я предлагаю вам проверить встроенные профилировщики Python ( profile
или cProfile
, в зависимости от ваших потребностей. ): http://docs.python.org/library/profile.html
Используйте модуль timeit
из стандарта Python библиотека.
Основное использование:
from timeit import Timer
# first argument is the code to be run, the second "setup" argument is only run once,
# and it not included in the execution time.
t = Timer("""x.index(123)""", setup="""x = range(1000)""")
print t.timeit() # prints float, for example 5.8254
# ..or..
print t.timeit(1000) # repeat 1000 times instead of the default 1million
Этот код очень неточен
total= 0
for i in range(1000):
start= time.clock()
function()
end= time.clock()
total += end-start
time= total/1000
Этот код менее неточен
start= time.clock()
for i in range(1000):
function()
end= time.clock()
time= (end-start)/1000
Очень неточный код страдает смещением измерения, если время выполнения функции близко к точности часов. Большинство измеренных значений времени представляют собой просто случайные числа от 0 до нескольких тактов часов.
В зависимости от рабочей нагрузки вашей системы, «время», которое вы наблюдаете из одной функции, может быть полностью артефактом планирования ОС и других неконтролируемых накладных расходов.
Вторая версия (менее неточная) имеет меньшую погрешность измерения. Если ваша функция действительно быстрая, вам может потребоваться запустить ее 10 000 раз, чтобы сгладить планирование ОС и другие накладные расходы.
И то, и другое, конечно, сильно вводит в заблуждение. Время выполнения вашей программы - в целом - не является суммой времени выполнения функции. Вы можете использовать числа только для относительных сравнений. Это не абсолютные измерения, которые несут много смысла.