人们说Python中的List是缓存友好的是什么意思?

问题描述 投票:0回答:1

我正在学习 python 数据结构,并发现列表是缓存友好的。有人可以用通俗的语言解释一下吗?什么是引用局部性?对列表元素的引用如何存储在数组中?

python-3.x data-structures python-dataclasses
1个回答
0
投票

Python 列表使用连续的内存块来加快索引速度。在内存中,你可以想象一个包含字符串的列表看起来像这样:

0x3334
+----+----+----+----+----+
| "S"| "t"| "a"| "c"| "k"| <-- Data stored at specific memory location
+----+----+----+----+----+
0x1  0x2  0x3  0x4  0x5    <-- Memory Addresses

0x3334 引用的连续内存块以及 0x1、0x2... 引用的块的各个索引

CPU 使用 CPU 缓存按重要性层次结构存储内存,范围从最近使用的数据到最近最少使用的数据。当数据连续存储时(例如在 Python 列表中),您会在堆中为列表分配大量内存。创建列表后,它会将这些数据存储在最近使用的 CPU 缓存级别中,以便快速检索列表。

引用局部性在这里是相关的,因为CPU缓存通常的设计方式是,与很长时间没有使用的数据相比,最近使用的数据更有可能被再次使用,而很长时间没有使用的数据不太可能被使用再次。

例如,如果您有一个变量在程序中使用得不多,那么当程序在处理器中执行时,它不太可能在程序中使用那么多,因此您不必调用该变量多次从 CPU 缓存中引用内存地址处的数据。如果循环中有一个变量,那么它将多次从内存存储中检索,因为它处于循环中,并且它将始终保留在 CPU 缓存(通常是 RAM)的最近使用的级别中。

访问最近最少使用的 CPU 缓存级别会产生很高的成本。该成本是时间(CPU 时钟周期)。如果您的 CPU 检查最近使用的缓存级别并发现列表中已分配内存的连续块的数据不存在,它将检查缓存的后续级别(级别 1、级别 2,... ,主内存),直到到达主内存,这是检索速度最慢的内存,因为它通常在物理上距离主板上的 CPU 较远。检索速度最快的内存是 RAM,因为它通常在物理上更靠近 CPU,或者在某些 CPU 中它是 CPU 本身的组件。

因此,Python 列表是缓存友好的,因为缓存中分配的内存是连续的,可以快速从存储中检索。

© www.soinside.com 2019 - 2024. All rights reserved.