Вопрос эффективности Django - PullRequest
0 голосов
/ 22 февраля 2010

Мне интересно, может ли это иметь какое-либо реальное значение для эффективности (т. Е. Время вычислений, память и т. Д.)

Это моя модель:

class FooUser(models.Model):
    name = models.CharField(max_length=50)
    sirname = models.CharField(max_length=50)

Предположим, у меня есть 2 разных подхода при сохранении FooUser в представлении: Первый - присвоение полученных значений переменной и передача ее объекту после этого.

#say I retrieve name and sirname from users cookie.(lets not care for the exceptions for now.
input_name =request.session['name']
input_sirname =request.session['sirname']

FooUser(name=input_name,sirname=input_sirname).save()

Второй, напрямую передаваемый в качестве параметра:

#say I retrieve name and sirname from users cookie.(lets not care for the exceptions for now.
FooUser(name=request.session['name'],sirname=request.session['sirname']).save()

Я знаю, что этот вопрос может быть немного глупым, но для длинных входных данных передача этих входных данных объекту делает код почти нечитаемым:)

Ответы [ 3 ]

4 голосов
/ 22 февраля 2010

Это:

 input_name =request.session['name']
 input_sirname =request.session['sirname']

не копирует строки в переменные. Это только назначение указателей на строковые объекты на имена в локальном словаре (input_name, input_sirname). Для лучшего объяснения вы можете взять лут по этому адресу: http://effbot.org/zone/python-objects.htm.

При написании этого слова промежуточные словарные записи (input_name, input_sirname) имеют такие низкие накладные расходы в 99,999% случаев, что могу поспорить, у вас есть другие узкие места в вашей программе, на которые вы должны обратить внимание.

И помните: преждевременная оптимизация - корень всего зла: -)

1 голос
/ 22 февраля 2010

Время, необходимое для привязки локального имени к значению, как, например, input_name = request.session['name'], абсолютно ничтожно по сравнению со временем, которое потребует само выполнение .save() - вы никогда не сможете его измерить.Итак, забудьте о таких небольших показателях эффективности и сфокусируйтесь на стиле, надежности, удобстве обслуживания (что хорошо в обоих случаях в вашем примере) - если и когда вам нужно настроить приложение на скорость, начните с профилирования .

0 голосов
/ 22 февраля 2010

Я бы сказал, что второй метод (с непосредственной передачей элементов request.session) более читабелен.Глядя на код, я сразу знаю, что происходит - это создание объекта с использованием необработанных, неизмененных данных сеанса.Если бы это была просто переменная, я бы не знал, откуда она взялась бы, если бы она была изменена за это время и т. Д. Мне пришлось бы читать гораздо большую часть кода.Вы можете разбить инструкцию на несколько строк.

FooUser(
    name=request.session['name'],
    sirname=request.session['sirname']
).save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...