Tôi đang cố gắng sử dụng trình biên dịch Python để tăng tốc mã của tôi. Tôi đã có thể xác định chức năng cụ thể, nơi gần như toàn bộ thời gian được sử dụng, nhưng tôi không thể tìm ra vị trí của hàm đó trong thời gian đó.Hiểu đầu ra của hồ sơ Python
Dưới đây tôi có đầu ra hồ sơ, cho thấy "appendBallot" là thủ phạm chính và tiêu thụ gần 116 giây. Dưới đây, tôi có mã cho "appendBallot".
Tôi không thể tìm ra từ đầu ra hồ sơ, phần nào của "appendBallot" tôi cần tối ưu hóa khi mục nhập thời gian cao nhất tiếp theo ít hơn một giây. Tôi chắc rằng nhiều bạn có thể cho tôi biết từ mã của tôi, nhưng tôi muốn hiểu cách lấy thông tin đó từ đầu ra hồ sơ. Mọi sự trợ giúp sẽ rất được trân trọng.
hồ sơ đầu ra:
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)
Code:
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)
Nó thực sự là khẳng định() đó là hogging lên tất cả các thời gian. Tôi tự hỏi, nếu trình lược tả Python bỏ qua các câu lệnh khẳng định() vì chúng sẽ không được thực thi nếu mã được chạy với -O, –
Cảm ơn tất cả các câu trả lời hữu ích. –
Trình biên dịch Python không bỏ qua 'assert'/statements/nhiều hơn là bỏ qua tất cả các câu lệnh/câu lệnh khác/trong phương thức. Viết 'assert (expression)' thay vì chỉ 'biểu thức khẳng định' không biến nó thành một lời gọi hàm có thể được bỏ qua. –