Python включает профилировщика, вызванного cProfile. Это не только дает общему времени выполнения, но также и временам каждая функция отдельно, и говорит Вам, сколько раз каждая функция была вызвана, помогая определить, где необходимо сделать оптимизацию.
можно назвать его из кода, или от интерпретатора, как это:
import cProfile
cProfile.run('foo()')
Еще более полезно, можно вызвать cProfile при выполнении сценария:
python -m cProfile myscript.py
Для создания этого еще легче я сделал немного пакетного файла под названием 'profile.bat':
python -m cProfile %1
, Таким образом, все, что я должен сделать, выполняется:
profile euler048.py
И я получаю это:
1007 function calls in 0.061 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.061 0.061 :1()
1000 0.051 0.000 0.051 0.000 euler048.py:2()
1 0.005 0.005 0.061 0.061 euler048.py:2()
1 0.000 0.000 0.061 0.061 {execfile}
1 0.002 0.002 0.053 0.053 {map}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler objects}
1 0.000 0.000 0.000 0.000 {range}
1 0.003 0.003 0.003 0.003 {sum}
РЕДАКТИРОВАНИЕ: Обновленная ссылка на хороший ресурс видео от PyCon 2013 назвала Python, Представляющий
Также через YouTube.
Да, это перебор и фактически приведет к более медленному коду, чем если бы вы передали int по значению. Тип int - четыре байта; ссылка (по сути, адрес памяти) также составляет четыре байта (на 32-битной машине) или восемь байтов (на 64-битной машине). Таким образом, вам может потребоваться передать функции больше информации - и, кроме того, у вас возникнут накладные расходы на разыменование этой ссылки.
Однако если вы передаете что-то большее, чем int, это больше эффективно использовать константную ссылку, потому что вы можете передать только четыре или восемь байтов вместо того, чтобы копировать весь объект.
Править Относительно Qt: Да, если слот принимает константную ссылку на объект, тогда Причина в том, чтобы сэкономить накладные расходы на копирование объекта.
Да, передача по ссылке помогает предотвратить копирование объектов. Но компилятор может решить полностью оптимизировать его и ввести передачу по значению, если он дает такой же эффект. Такая оптимизация обычно возможна, если функция и сайт вызова находятся в одной единице трансляции, но некоторые компиляторы могут выполнять еще более глобальную оптимизацию - вы можете проверить созданную сборку, если вам интересно.
Вот почему вы действительно не должны проходить примитивные типы по ссылке, если вы заботитесь о производительности и если у вас нет для этого действительно причин. См. Какая польза от передачи константных ссылок на примитивные типы? для обсуждения этой проблемы.
Во-первых, разница между
: обычно ссылка на константу передается путем передачи указателя, остальное передается путем копирования. После звонка (со стороны звонящего) результат равный. Все, что вы передаете функции, не изменяется при вызове.
Внутри функции вы также не увидите никаких различий (по крайней мере, по int). В объектах вы, конечно, можете использовать только константные функции.
Что касается производительности - передача константной ссылки на int может (или не может) быть медленнее, в зависимости от компилятора и оптимизации. Компилятор может (теоретически) оптимизировать передачу константной ссылки на передачу по значению, но я не знаю, так ли это. Работа с указателями на целые числа вместо значений, конечно, медленнее.
Подробнее об этом см. When to use pointers, and when not to use them
After reading the other linked post - the compiler can not optimize it away in a multithreaded environment. At least in a MT-environment there are real differences betwenn const int& and int calls. +1 for that link.