Почему время выполнения функций не постоянное? - PullRequest
0 голосов
/ 12 июня 2018

Теоретически я прочитал в своем университетском классе порядок роста функций и попытался реализовать его практически дома.Хотя порядок роста оказался точно таким же, как в учебниках, но время их выполнения меняется с каждым разом, когда я выполняю программу.Почему это так?

Исходный код

import time
import math
from tabulate import tabulate
n=eval(input("Enter the value of n: "));
t1=time.time()
a=12
t2=time.time()
A=t2-t1
t3=time.time()
b=n
t4=time.time()
B=t4-t3
t5=time.time()
c=math.log10(n);
t6=time.time()
C=t6-t5
t7=time.time()
d=n*math.log10(n);
t8=time.time()
D=t8-t7
t9=time.time()
e=n**2
t10=time.time()
E=t10-t9
t11=time.time()
f=2**n
t12=time.time()
F=t12-t11

print(tabulate([['constant',a,A], ['n',b,B], ['logn',c,C], ['nlogn',d,D], ['n**2',e,E], ['2**n',f,F]], headers=['Function', 'Value', 'Time']))
templist= [A,B,C,D,E,F]
print("The time order in acsending order is: ", sorted(templist,key=int)) 

Первое выполнение

naufil@naufil-Inspiron-7559:~/Desktop/python$ python3 time_order.py
Enter the value of n: 100
Function              Value         Time
----------  ---------------  -----------
constant       12            2.14577e-06
n             100            1.43051e-06
logn            2            4.1008e-05
nlogn         200            3.57628e-06
n**2        10000            3.33786e-06
2**n            1.26765e+30  3.8147e-06
The time order in acsending order is:  [2.1457672119140625e-06, 1.430511474609375e-06, 4.100799560546875e-05, 3.5762786865234375e-06, 3.337860107421875e-06, 3.814697265625e-06]

Второе выполнение

naufil@naufil-Inspiron-7559:~/Desktop/python$ python3 time_order.py
Enter the value of n: 100
Function              Value         Time
----------  ---------------  -----------
constant       12            2.14577e-06
n             100            1.19209e-06
logn            2            4.64916e-05
nlogn         200            4.05312e-06
n**2        10000            3.33786e-06
2**n            1.26765e+30  3.57628e-06
The time order in acsending order is:  [2.1457672119140625e-06, 1.1920928955078125e-06, 4.649162292480469e-05, 4.0531158447265625e-06, 3.337860107421875e-06, 3.5762786865234375e-06]

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Как правильно отмечали другие комментарии и ответы, причина разницы во времени выполнения, которую вы наблюдаете, связана с тем, как работают операционные системы.Но выполнение строгих мер - это сложный вопрос, поэтому позвольте мне подробнее остановиться на нем и дать вам подсказки, куда вам следует направить свои эксперименты.

Что ваша ОС делает за вашей спиной

Вы можете видеть ОС как проводника и программы как инструментальные проигрыватели, и представьте себе, что есть только очень много инструментов, которые могут играть одновременно.Поэтому дирижер должен каждый раз выбирать, кто должен играть, и быть уверенным, что в конце концов никто не расстроится!Таким же образом, ОС постоянно отвечает за выбор программ для выполнения, а именно за то, на какую программу выделять процессорное время.Количество программ (или, скорее, процессов), которые могут быть выполнены одновременно, обычно ограничено количеством ядер в вашем процессоре.

На практике способ, которым ОС выбирает, что выполнять, очень сложен.и захватывающий предмет, который опирается на эвристику, опирающуюся на эксперименты.(Подробнее здесь ).Что вам нужно понять, так это то, что вам вряд ли удастся изменить это поведение, и никто не сможет гарантировать одинаковое время выполнения между двумя вызовами.

Использование команды time linux

Вызов Python time, как вы делаете, измеряет физическое время, прошедшее между двумя вызовами, поэтому из-за того, что мы сказали, вы не только измеряете время, затрачиваемое на выполнение вашей программы.Если вы хотите лучше понять, какое время ОС фактически отводит вашей программе, вы можете использовать команду linux time.Время user даст вам фактическое время ЦП, выделенное для выполнения вашей программы.Проверьте эту тему для получения дополнительной информации.Но поймите, что это время также подвержено колебаниям!

Какую мудрость вы пытаетесь извлечь из своих измерений?

Наконец, вы должны спросить себя, действительно ли точное время соответствует вашему желанию,Вы заботитесь о ценности?или вы хотите продемонстрировать поведение?

Обычно то, что делается для измерения производительности, - это усреднение времени выполнения повторных вызовов.Таким образом, эффекты, относящиеся к бизнесу ОС, должны быть усреднены.(Вы можете видеть это как построение объективной оценки для случайного процесса).Из того, что я понимаю, вы пытаетесь показать разницу во времени выполнения для алгоритмов с различной сложностью.Таким образом, фактическое время выполнения не так важно, так как это относительный порядок.Вот почему усреднение нескольких вызовов уменьшит дисперсию наблюдения, и вы сможете делать более сильные заявления относительно относительного времени выполнения.

0 голосов
/ 12 июня 2018

Вам следует обратиться с этим вопросом к вашей операционной системе.Что еще работает на вашем компьютере?Перечислите различные процессы и посмотрите, сколько их;все, что требуется, - это процесс или даже контекстный обмен, чтобы изменить время выполнения.Помимо прочего, вызов time.time может вызвать такой переключатель, поскольку это вызов системного процесса.

Это также зависит от того, какие подпрограммы поддержки системы уже загружены при их вызове - многие из нихзвонки неявные или вторичные.Если вам нужно выделить больше памяти для конкретной инструкции, потому что другой процесс забрал последнюю часть вашей ОЗУ, а затем выгрузился ... ну, вы поняли идею, я надеюсь.

...