Python 使用Django将列表中的每个元素与数据库中的每个元素进行比较的优化

Python 使用Django将列表中的每个元素与数据库中的每个元素进行比较的优化,python,django,sqlite,django-1.10,Python,Django,Sqlite,Django 1.10,我正在参与Django 1.10中的一个项目,我的一个应用程序要求我导入500-100000个IP地址的列表,然后将这些500-100000个IP地址与存储在我的SQLite3数据库中的25000多个IP地址进行比较。不幸的是,这需要相当长的时间,这是我非常需要减少的 我的数据库由一个主机表和一个名为ipv4\u地址的字段组成 以下是相关的model.py: class Host(models.Model): ipv4_address = models.GenericIPAddressF

我正在参与Django 1.10中的一个项目,我的一个应用程序要求我导入500-100000个IP地址的列表,然后将这些500-100000个IP地址与存储在我的SQLite3数据库中的25000多个IP地址进行比较。不幸的是,这需要相当长的时间,这是我非常需要减少的

我的数据库由一个
主机
表和一个名为
ipv4\u地址
的字段组成

以下是相关的model.py:

class Host(models.Model):
    ipv4_address = models.GenericIPAddressField(protocol='ipv4', default='0.0.0.0', unique=True)
下面是相关的views.py:

bad_ips = []
read_bad_ips = [ '500', 'to', '100000', 'ips', 'here', '...' ]

for ip in read_bad_ips:
    if Host.objects.filter(ipv4_address=ip).exists():
        bad_ips.append(Host.objects.get(ipv4_address=ip))
其中,
read\u bad\u ips
是IP地址列表,
bad\u ips
是数据库和
read\u bad\u ips
列表中我想要的IP的列表

从views.py优化这段代码的最佳方法是什么?

谢谢

编辑:@nik_m的解决方案解决了这场危机

read_bad_ips=['500','to','100000','ips','here','…']

addresses=Host.objects.values\u list('ipv4\u address',flat=True)

bad\u ips=列表(设置(读取\u bad\u ips)。交叉点(地址))

您可以这样做:

bad_ips = Host.objects.filter(ipv4_address__in=read_bad_ips).values_list('ipv4_address', flat=True)
这将为您提供
read\u bad\u ips
列表中的
ipv4\u地址
值的列表(可能是emtpy,可能不是)

[编辑]: 由于您使用的是sqlite数据库,并且此数据库有其局限性(由于您拥有大量的值),因此您可以尝试以下方法:

for addr in Host.objects.values_list('ipv4_address', flat=True).iterator():
    if addr in read_bad_ips:
        bad_ips.append(addr)
[编辑2]: 尝试使用
set
的方法,如下所示:

read_bad_ips = [ '500', 'to', '100000', 'ips', 'here', '...' ]
addresses = Host.objects.values_list('ipv4_address', flat=True)

bad_ips = list(set(read_bad_ips).intersection(addresses))

这是我尝试的一种方式,但不幸的是,它抛出了这个错误:
异常类型:OperationalError
异常值:太多SQL变量编辑:它这样做的原因是因为SQLite将最大变量数限制为999,以防止内存分配过多。
读取错误\u ips
列表的长度约为500个元素?这是一个sqlite3问题。您是否计划更改您的数据库?因为sqlite有它的局限性…我们希望在这个项目中坚持使用sqlite。我坚持认为有人以前遇到过类似的问题,并且已经找到了一些解决方法。使用迭代器遍历数据怎么样?查看我的(更新的)答案。刚刚尝试了更新的答案。它可以工作,但比我原来的视图要长3倍。哎呀,哈哈。顺便问一下,谢谢你帮我。read\u bad\u IP是一个不同IP的列表,还是包含重复的IP?如果存在重复项并且不关心排序(read_bad_ips=list(set(read_bad_ips))@Johnny,
read_bad_ips
只提供了唯一的IP地址,那么您可以通过消除重复项来节省一些时间。感谢您的反馈!