只要几个值的时候,什么时候该用 values() / values_list()?省多少?这篇用 5 万行数据量出耗时和峰值内存,并说明 values 系列失去了什么。
对象:Row.objects.all() 134.1 ms 峰值内存 42.3 MiB 类型 Row
对象:only('a') 122.8 ms 峰值内存 24.9 MiB 类型 Row
values('a', 'b') → dict 28.6 ms 峰值内存 16.6 MiB 类型 dict
values_list('a', 'b') → tuple 23.9 ms 峰值内存 7.8 MiB 类型 tuple
values_list('a', flat=True) → int 17.6 ms 峰值内存 5.1 MiB 类型 int
values_list(全部列) → tuple 40.7 ms 峰值内存 24.3 MiB 类型 tuple
values()(全部列) → dict 52.0 ms 峰值内存 33.1 MiB 类型 dict耗时每种取 3 次中最快的一次(不带 tracemalloc);内存是另开一次用 tracemalloc 量的峰值。(我第一次把两者混在一起量,tracemalloc 把耗时放大了近 7 倍,后来拆开了。)
对象 : Row 每个对象带 __dict__ 与 _state: ['_state', 'a', 'b', 'c', 'd', 'id'] …
values : {'a': 0, 'b': 'bee-0'}
values_list: (0, 'bee-0')
flat : 0
named : Row(a=0, b='bee-0')对象能用模型上的属性(如 __str__ 等),values() 只有列: values 的 key: ['id', 'a', 'b', 'c', 'd']
取舍:需要模型上的方法 / 属性 / 信号 / 关系访问就用对象;只要数据(导出、聚合前的中间值、大批量处理)用 values / values_list;只想省一列大字段,only / defer(第 29 篇)。