哪一个尺度更好?ORM';s distinct()或python set()

哪一个尺度更好?ORM';s distinct()或python set(),python,mysql,django,postgresql,Python,Mysql,Django,Postgresql,新年快乐 我有一个模型,可以保存几十万条记录。模型如下所示: class Transaction(models.Model): user = models.ForeignKey(User) client = models.ForeignKey(Client) amount = models.FloatField() 我想知道某个用户正在处理的所有客户。要获得唯一的客户端ID,我可以单独使用Django ORM: Transaction.objects.filter(us

新年快乐

我有一个模型,可以保存几十万条记录。模型如下所示:

class Transaction(models.Model):
    user = models.ForeignKey(User)
    client = models.ForeignKey(Client)
    amount = models.FloatField()
我想知道某个用户正在处理的所有客户。要获得唯一的客户端ID,我可以单独使用Django ORM:

Transaction.objects.filter(user=the_user).distinct('client_id').values_list('client_id', flat=True)
或执行以下操作:

set(Transaction.objects.filter(user=the_user).values_list('client_id', flat=True))
两者将产生相同的结果。但是考虑到大量的记录,哪一个会更快呢?我知道
distinct
在数据库上是一个相对较慢的操作,但它与python的
set()
相比如何呢


最后,如果涉及到数据库,我的选择是MySql和PostgreSql用于生产。对于这个特定的操作,它们之间有什么区别吗?

我通常使用orm函数,它更具可读性,并且在数据库级别上运行,您的RDBMS也会计算不同的值,您只需一步就可以得到结果

您可以使用python集实现同样的功能,但首先需要使用所有数据集,然后应用set()。因此,您必须执行两步操作才能执行相同的操作


在第一种情况下(orm),您只有I/O开销,在第二种情况下,您有I/O开销+函数调用,因此我将使用orm的distinct。

我希望您实际上没有使用浮点数来存储货币金额。好吧,假设我使用十进制,这只是一个简单的示例!)我希望
.distinct
依赖于RDBMS的实现,RDBMS的唯一性可能比Python的
set
快得多。一个更好的问题是:“我已经使用timeit测量了计时,并得到了以下结果:等等,等等,等等。既然我在bluh看到了那样的错误,为什么等等比等等快呢?”作为一个模板示例。我有点不安,因为您认为数据库上的DISTINCT比Python上的要慢。这是一个普遍的信念吗?人们对此有什么理由吗?我什么都不相信,事实上我不知道,这就是为什么我一开始就这么问的原因!我读到distinct是一个相对缓慢的操作,我想让人们告诉我这一点,我不认为这会打扰到别人。更重要的是,在第二种情况下,您需要将更多数据从DB传输到Python,这会增加I/O开销。当然,这样做的好处是数据库可以省去一些工作,但希望DB的
distinct
功能与Python的
set
一样高效,或者比Python的
set
更高效。有趣的是,内存权衡是一个重要因素,因为RDBMS无论如何都会加载所有记录。我会选择distinct,如果有时间,我可能会做一个适当的基准测试。谢谢大家!!