Понимание профиля Python производится

О выживании Вас являются правильными: переключите или перенаправьте ссылку slashdotted на статическую страницу HTML без графики. Вы могли бы даже хотеть поместить эту страницу на другой веб-сервер, таким образом, Ваш исходный сервер не возьмет слишком много загрузки.

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

, Но как обнаружить это, это, я хотел бы знать, также! Просто подсчет хитов за последние несколько секунд не мог бы быть достаточно?

7
задан gaefan 24 September 2009 в 03:50
поделиться

6 ответов

Профайлеры могут быть такими. Я использую метод этот . Он мгновенно переходит к сути проблемы.

4
ответ дан 6 December 2019 в 06:50
поделиться

Да, я тоже столкнулся с той же проблемой.

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

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

7
ответ дан 6 December 2019 в 06:50
поделиться

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

вместо того, чтобы пытаться присвоить какую-то уникальную строку каждому бюллетеню, не могли бы вы просто use the ballotID (an integer number?)

now you could have a dictionary (uniqueBallotIDs) mapping ballotID and the actual ballot object.

the process might be something like this:

def appendBallot(self, ballot, ballotID=None):
   if ballotID is None:
       ballotID = self._getuniqueid() # maybe just has a counter? up to you.
   # check to see if we have seen this ballot before.
   if not self._isunique(ballotID):
       # code for non-unique ballot ids.
   else:
       # code for unique ballot ids.

   self.ballotOrder.append(i)

You might be able to handle some of your worries about the dictionary missing a given key by using a defaultdict (from the collections module). collection docs

Edit for completeness I will include a sample usage of the defaultdict:

>>> from collections import defaultdict            

>>> ballotIDmap = defaultdict(list)
>>> ballotID, ballot = 1, object() # some nominal ballotID and object.
>>> # I will now try to save my ballotID.
>>> ballotIDmap[ballotID].append(ballot)
>>> ballotIDmap.items()
[(1, [<object object at 0x009BB950>])]
5
ответ дан 6 December 2019 в 06:50
поделиться

Я поддержу Фрагсуорта, сказав, что вы захотите разделить свою функцию на более мелкие.

Сказав это, вы правильно читаете вывод: totaltime - это единственное время. смотреть.

Теперь о том, где, вероятно, будет ваше замедление:

Поскольку кажется, что существует 100000 вызовов appendBallot и нет очевидных циклов, я бы посоветовал это в вашем assert. Поскольку вы выполняете:

assert(ballotID not in self.ballotIDs)

Это фактически будет действовать как цикл. Таким образом, в первый раз, когда вы вызываете эту функцию, она будет перебирать (возможно, пустой) массив, а затем утверждать, найдено ли значение. В 100000-й раз он будет перебирать весь массив.

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

В качестве альтернативы, если вы ищете некоторый уровень устойчивости, используйте ORM и заставьте его выполнять генерацию идентификатора и уникальную проверку за вас.

4
ответ дан 6 December 2019 в 06:50
поделиться

Я использовал этот декоратор в своем кода, и это помогло мне в настройке pyparsing.

4
ответ дан 6 December 2019 в 06:50
поделиться

У вас есть две проблемы в этом небольшом фрагменте кода:

# 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)

Во-первых, кажется, что self.ballotIDs - это список, поэтому оператор assert вызовет квадратичное поведение. Поскольку вы вообще не предоставили никакой документации для своих структур данных, невозможно быть предписывающим, но если порядок появления не имеет значения, вы можете использовать набор вместо списка.

Во-вторых, логика (в отсутствие документации о том, что такое ballotID и что означает not-None ballotID arg) кажется серьезно ошибочной:

obj.appendBallot(ballota, 2) # self.ballotIDs -> [2]
obj.appendBallot(ballotb)    # self.ballotIDs -> [2, 1]
obj.appendBallot(ballotc)    # wants to add 2 but triggers assertion

Другие комментарии:

Вместо adict .has_key (key) , используйте ключ в adict - он быстрее и выглядит лучше.

Вы можете рассмотреть возможность просмотра своих структур данных ... они кажутся немного причудливыми; на их создание может уйти изрядное количество процессорного времени.

они кажутся слегка барочными; на их создание может уйти изрядное количество процессорного времени.

они кажутся слегка барочными; на их создание может уйти изрядное количество процессорного времени.

2
ответ дан 6 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: