Я пытаюсь использовать профилировщик Python для ускорения моего кода. Я смог определить конкретную функцию, где почти все время тратится, но я не могу понять, где в этой функции время расходуется.Понимание профиля профиля Python
Ниже у меня есть профиль, который показывает, что «appendBallot» является основным виновником и потребляет почти 116 секунд. Далее ниже, у меня есть код для «appendBallot».
Я не могу понять из вывода профиля, какую часть «appendBallot» мне нужно оптимизировать, поскольку следующая самая высокая запись времени меньше секунды. Я уверен, что многие из вас могли бы рассказать мне только из моего кода, но я хотел бы понять, как получить эту информацию из вывода профиля. Любая помощь будет принята с благодарностью.
выход профиля:
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 116.168 116.168 <string>:1(<module>)
1 0.001 0.001 116.168 116.168 {execfile}
1 0.003 0.003 116.167 116.167 foo.py:1(<module>)
1 0.000 0.000 116.139 116.139 ballots.py:330(loadKnown)
1 0.000 0.000 116.109 116.109 plugins.py:148(load)
1 0.196 0.196 116.108 116.108 BltBallotLoader.py:37(loadFile)
100000 114.937 0.001 115.912 0.001 ballots.py:133(appendBallot)
100000 0.480 0.000 0.790 0.000 ballots.py:117(newBallot)
316668 0.227 0.000 0.310 0.000 ballots.py:107(getNumCandidates)
417310/417273 0.111 0.000 0.111 0.000 {len}
200510 0.071 0.000 0.071 0.000 {method 'append' of 'list' objects}
99996 0.045 0.000 0.045 0.000 {method 'add' of 'set' objects}
100000 0.042 0.000 0.042 0.000 {method 'has_key' of 'dict' objects}
1 0.000 0.000 0.030 0.030 plugins.py:202(getLoaderPluginClasses)
1 0.000 0.000 0.030 0.030 plugins.py:179(getPluginClasses)
1 0.000 0.000 0.030 0.030 plugins.py:205(getLoaderPluginClass)
3 0.016 0.005 0.029 0.010 {__import__}
1 0.022 0.022 0.025 0.025 ballots.py:1(<module>)
1 0.010 0.010 0.013 0.013 BltBallotLoader.py:1(<module>)
7 0.000 0.000 0.003 0.000 re.py:227(_compile)
Код:
def appendBallot(self, ballot, ballotID=None):
"Append a ballot to this Ballots object."
# String representation of ballot for determining whether ballot is unique
ballotString = str(list(ballot))
# Ballot as the appropriate array to conserve memory
ballot = self.newBallot(ballot)
# Assign a ballot ID if one has not been given
if ballotID is None:
ballotID = len(self.ballotIDs)
assert(ballotID not in self.ballotIDs)
self.ballotIDs.append(ballotID)
# Check to see if we have seen this ballot before
if self.uniqueBallotsLookup.has_key(ballotString):
i = self.uniqueBallotsLookup[ballotString]
self.uniqueBallotIDs[i].add(ballotID)
else:
i = len(self.uniqueBallots)
self.uniqueBallotsLookup[ballotString] = i
self.uniqueBallots.append(ballot)
self.uniqueBallotIDs.append(set([ballotID]))
self.ballotOrder.append(i)
Это действительно утверждение(), которое постоянно держится. Интересно, игнорирует ли профайлер Python команды assert(), поскольку они не будут выполняться, если код запущен с -O, –
Спасибо за все полезные ответы. –
Профайлер Python не игнорирует 'assert'/statements/больше, чем игнорирует все остальные/statements/в методе. Написание 'assert (выражение)' вместо просто 'assert expression' не превращает его в вызов функции, который может быть невозможен. –