Python 什么效率更高。objects.filter().exists()或get()在尝试时包装
我正在为django应用程序编写测试,我想检查对象是否已保存到数据库中。哪种方法最有效/正确Python 什么效率更高。objects.filter().exists()或get()在尝试时包装,python,django,testing,django-models,Python,Django,Testing,Django Models,我正在为django应用程序编写测试,我想检查对象是否已保存到数据库中。哪种方法最有效/正确 User.objects.filter(username=testusername).exists() 或 如果您不需要用户,第一个更有效,因为它不会实例化对象。我想说.exists()如果您只是尝试确定是否存在与筛选器匹配的对象,那么它是更好的方法。原因是您的.get()示例只涵盖了三种场景中的两种。还有MultipleObjectsReturned异常,当发现多个对象与筛选器匹配时,会引发该异常
User.objects.filter(username=testusername).exists()
或
如果您不需要用户,第一个更有效,因为它不会实例化对象。我想说
.exists()
如果您只是尝试确定是否存在与筛选器匹配的对象,那么它是更好的方法。原因是您的.get()
示例只涵盖了三种场景中的两种。还有MultipleObjectsReturned
异常,当发现多个对象与筛选器匹配时,会引发该异常
我将使用.get()
获取单个实例,并使用except子句捕获异常工作流。速度测试:exists()
vs.get()+try/except
在Test.py中测试函数:
from testapp.models import User
def exists(x):
return User.objects.filter(pk=x).exists()
def get(x):
try:
User.objects.get(pk=x)
return True
except User.DoesNotExist:
return False
在shell中使用timeit:
In [1]: from testapp import test
In [2]: %timeit for x in range(100): test.exists(x)
10 loops, best of 3: 88.4 ms per loop
In [3]: %timeit for x in range(100): test.get(x)
10 loops, best of 3: 105 ms per loop
In [4]: timeit for x in range(1000): test.exists(x)
1 loops, best of 3: 880 ms per loop
In [5]: timeit for x in range(1000): test.get(x)
1 loops, best of 3: 1.02 s per loop
结论:
存在()
检查对象是否已保存在数据库中的速度超过10%。谢谢!不过,您是对的,在这种情况下,用户名在Django用户模型中是唯一的,如果不使用正则表达式,则永远不会引发multipleObjectsReturn[我不知道regexs是否可以在get()中使用,还是只能在filter()中使用…]。如果user.exists():return user.first()否则:return false尝试:return user.objects.get(username=testusername)Exception User.DoesNotExist:return False Exception User.MultipleObjectsReturn:return False此时它是个人首选项。如果可读性更重要,我会选择第一种,但是如果你更关心性能,我会选择第二种(尽管差别很小)。
In [1]: from testapp import test
In [2]: %timeit for x in range(100): test.exists(x)
10 loops, best of 3: 88.4 ms per loop
In [3]: %timeit for x in range(100): test.get(x)
10 loops, best of 3: 105 ms per loop
In [4]: timeit for x in range(1000): test.exists(x)
1 loops, best of 3: 880 ms per loop
In [5]: timeit for x in range(1000): test.get(x)
1 loops, best of 3: 1.02 s per loop