2014-01-02 2 views
5

Я работал над некоторыми проблемами Project Euler в Python 3 [osx 10.9], и мне нравится знать, как долго они будут выполняться.Python - time.time() vs bash time

Я использую следующие два подхода ко времени мои программы:

1)

import time 
start = time.time() 

[program] 

print(time.time() - start) 

2) в командной строке Баш, набрав time python3 ./program.py

Однако, эти два метода часто дают wildy разные результаты. В программе я работаю сейчас, первые возвращается 0.000263 (секунды, усеченные), а второй дает

real 0m0.044s 
user 0m0.032s 
sys  0m0.009s 

Очевидно, что существует огромное несоответствие - на два порядка по сравнению с real времени.

Мои вопросы:
a) Почему разница? Это накладные расходы от переводчика?
b) Какую мне следует использовать для точного определения времени выполнения программы? Является ли time.time() точным с такими небольшими интервалами?

Я понимаю, что эти минимальные времена не имеют первостепенной важности; это было скорее любопытством.

Спасибо.

[UPDATE:]
Благодарственное вам все ответы & комментарии. Вы были правы с накладными расходами. Эта программа:

import time 
start = time.time() 

print("hello world") 

print(time.time() - start) 

занимает ~ 0.045 сек, в соответствии с bash.

Моя сложная проблема Эйлера Эйлера заняла ~ 0.045 сек, согласно bash. Задача решена.

Взгляните на timeit. Благодарю.

+0

Я бы предположил, что это связано с порядком, в котором они называются. – IanAuld

+1

Догадка заключается в том, что Python проводит большую часть времени, загружая сценарий и разрешая импорт. Только после этого ваш 'time.time()' начнет подсчет. Попробуйте использовать класс 'profile' для запуска вашего критического алгоритма. Также см .: http://stackoverflow.com/questions/582336/how-can-you-profile-a-python-script – Nate

ответ

10

Переводчик импортирует site.py и может касаться других файлов при запуске. Все это занимает много времени, прежде чем ваш import time линия никогда не выполняется:

$ touch empty.py 
$ time python3 empty.py 

real 0m0.158s 
user 0m0.033s 
sys  0m0.021s 

При синхронизации кода, примите во внимание, что другие процессы, дисковые флеши и аппаратные прерывания все время принимать слишком и влиять на ваши тайминги.

Используйте timeit.default_timer(), чтобы получить самый точный таймер для вашей платформы, но предпочтительно использовать сам модуль timeit, чтобы разделить отдельные фрагменты кода, чтобы устранить как можно больше переменных.

+0

Whoa. 158 мс ... Это потрясающе. – baum

+0

Я могу повторить это и получить половину времени; все зависит от того, что делают ОС и оборудование. –

+0

Да, конечно, но это поразительно. – baum

4

Поскольку при запуске time встроенных в bash в реальном времени используется время, затраченное на запуск интерпретатора Python, и импортирование необходимых модулей для запуска вашего кода, а не просто выбор времени выполнения одной функции в вашем коде ,

Чтобы убедиться в этом, попробуйте, например

import os 
import time 
start = time.time() 
os.system('python <path_to_your_script>') 
print time.time() - start 

Вы обнаружите, что это гораздо ближе к тому, time отчеты.

Смежные вопросы