скрипт Python для бенчмаркинга показывает загадочные задержки - PullRequest
0 голосов
/ 02 июля 2011

у меня есть два модуля: moduleParent и moduleChild

я делаю что-то вроде этого в moduleParent:

import moduleChild

#a bunch of code

start = time.time()
moduleChild.childFunction()
finish = time.time()
print "calling child function takes:", finish-start, "total seconds"

#a bunch of code

я делаю что-то подобное в moduleChild:

def childFunction():
    start = time.time()
    #a bunch of code
    finish = time.time()
    print "child function says it takes:", finish-start, "total seconds"

вывод выглядит так:

calling child function takes: .24 total seconds
child function says it takes: 0.0 total seconds

поэтому мой вопрос: откуда эти .24 дополнительные секунды?

спасибо за ваш опыт.

#

вот фактический код "childFuntion". это действительно не должно занимать .24 секунды.

 def getResources(show, resourceName='', resourceType=''):
   '''
   get a list of resources with the given name

   @show: show name
   @resourceName: name of resource
   @resourceType: type of resource
   @return: list of resource dictionaries
   '''

   t1 = time.time()

   cmd = r'C:\tester.exe -cmdFile "C:\%s\info.txt" -user root -pwd root'%show
   cmd += " -cmd findResources -machineFormatted "

   if resourceName:
       cmd += '-name %s'%resourceName

   if resourceType:
       cmd += '_' + resourceType.replace(".", "_") + "_"

   proc=subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   output = proc.stdout.read()
   output = output.strip()

   resourceData = output.split("\r\n")
   resourceData = resourceData[1:]

   resourceList = []
   for data in resourceData:
       resourceId, resourceName, resourceType = data.split("|")
       rTyp = "_" + resourceType.replace(".", "_") + "_"
       shot, assetName = resourceName.split(rTyp)
       resourceName = assetName
       path = '//projects/%s/scenes/%s/%s/%s'%(show, shot, resourceType.replace(".", "/"), assetName)
       resourceDict = {'id':resourceId, 'name':resourceName, 'type':resourceType, 'path':path }
       resourceList.append(resourceDict)

   t2 = time.time()
   print ("     ", t2 - t2, "seconds")


   return resourceList

Ответы [ 2 ]

0 голосов
/ 02 июля 2011

Вы не можете измерить время функции, запустив ее один раз, особенно ту, которая работает так мало. Существует множество факторов, которые могут повлиять на время, не в последнюю очередь это то, что другие процессы у вас работают в системе.

Примерно так я бы, наверное, прогнал хотя бы несколько сотен раз. Проверьте модуль timeit .

0 голосов
/ 02 июля 2011

Редактировать 2: Я только что заметил опечатку в дочерней функции, у вас есть t2 - t2 в операторе печати

игнорировать ниже:

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

Редактировать: также, вызывая таймеры, а также накладные расходы на печатную рекламу.Теперь, когда я думаю об этом, вызов print может составлять много из этих 24 секунд.IO медленный.

...