Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过get传递对象的效率如何?_Python_Django - Fatal编程技术网

Python 通过get传递对象的效率如何?

Python 通过get传递对象的效率如何?,python,django,Python,Django,我有一个查看功能,可以使用对象的ID获取对象(例如a、B和C)。 此视图函数调用本地函数 我应该将对象传递给本地函数,还是应该传递ID并在那里再次执行get?哪个更有效? 使用get传递对象或检索对象,哪个开销更大?我不知道为什么您会认为将对象传递到函数中会有任何开销。这总是比再次从数据库中查询要便宜,这意味着构造查询、调用数据库并从结果中实例化某些内容 唯一需要传递ID而不是对象的时间是在异步上下文中,比如芹菜任务;在这里,您需要确保您获得了对象的最新版本,在处理任务时,该对象可能已在数据库中

我有一个查看功能,可以使用对象的ID获取对象(例如a、B和C)。
此视图函数调用本地函数

我应该将对象传递给本地函数,还是应该传递ID并在那里再次执行get?哪个更有效?

使用get传递对象或检索对象,哪个开销更大?

我不知道为什么您会认为将对象传递到函数中会有任何开销。这总是比再次从数据库中查询要便宜,这意味着构造查询、调用数据库并从结果中实例化某些内容


唯一需要传递ID而不是对象的时间是在异步上下文中,比如芹菜任务;在这里,您需要确保您获得了对象的最新版本,在处理任务时,该对象可能已在数据库中更改。

以这种方式传递参数非常便宜:在后台,它是通过一个额外的指针实现的。这几乎肯定比再次调用django机制要快,对于ID查找,它至少必须涉及(仍然很快,但相对较慢)字典查找,或者如果它不进行缓存,则可能涉及重新查询数据库(这将非常缓慢,尤其是在数据库很大的情况下)


如果可能的话,我更喜欢传递局部变量,除非这样做有利于代码的清晰性(但我想不出任何情况下局部变量不是更清晰的选项),或者如果“外部世界”由该对象捕获的内容可能已经以您需要注意的方式发生了更改。

传递python对象没有开销,而传递
id
重复
get()
将导致数据库查找,这将花费更大的成本

但是,这取决于具体情况,应首选哪一种。考虑一个多用户的情况,其中两个用户修改同一个对象:

from django.db import models

class Movie(models.Model):
    coolness = models.IntegerField()
    times_modified = models.IntegerField()
视图函数可能会调用一些繁重的计算来计算请求的冷却度:

def update_coolness(delta_coolness, id):
    movie = Movie.objects.get(pk=id)  # Read object from database
    movie.times_modified += 1
    movie.save()
    time.sleep(5)  # Heavy computation
    movie.coolness += delta_coolness*4  # Very cool movie
    movie.save()
如果多个用户同时执行此查询,则结果可能是由于传统的原因

您可以通过重复get请求或简单地执行以下操作来避免保存错误的冷却度值:

这大大减少了其他用户可能干扰您计算的时间段。但是,干净的解决方案是使用
transaction.atomic
,它将在过程中锁定项目:

from django.db import transaction

def update_coolness(delta_coolness,id):
    with transaction.atomic():
        movie = Movie.objects.get(pk=id)  # Read object from database
        movie.times_modified+=1
        movie.save()
    time.sleep(5)  # Heavy computation
    with transaction.atomic():
        movie.refresh_from_db() # make sure we have the newest version
        movie.coolness += delta_coolness*4  # Very cool movie
        movie.save()

传递对象引用。
from django.db import transaction

def update_coolness(delta_coolness,id):
    with transaction.atomic():
        movie = Movie.objects.get(pk=id)  # Read object from database
        movie.times_modified+=1
        movie.save()
    time.sleep(5)  # Heavy computation
    with transaction.atomic():
        movie.refresh_from_db() # make sure we have the newest version
        movie.coolness += delta_coolness*4  # Very cool movie
        movie.save()