Python实现是否使用Cache Oblivious Data Structures?

时间:2018-02-12 17:40:28

标签: python cpython python-internals

我正在阅读关于缓存遗忘数据结构的好处的article,并发现自己想知道Python实现(CPython)是否使用这种方法?如果没有,是否有技术限制阻止它?

1 个答案:

答案 0 :(得分:2)

我认为这与内置(标准库)Python数据结构无关。

  • 在Python中创建一个新的数据类型意味着创建一个类,它不是底层基本类型或方法指针的简单包装,而是一种特殊类型的结构,它具有大量来自的元数据Python对象数据模型。

  • Python中没有本机树数据结构。有列表,数组和基于数组的哈希表(dict,set),以及collections模块中的一些扩展。第三方树/特里/等等,如果适合预期用途,则实现可以自由地提供高速缓存无关的实现。这将包括CPython C级实现,例如使用自定义扩展模块或通过Cython等工具。

  • NumPy ndarray是一个连续的数组数据结构,用户可以选择数据类型(理论上,用户可以选择一种不易被制作成倍数的怪异数据类型机器架构的缓存大小)。对于固定数据类型也许可以改进一些定制(对于array.array可能也是如此),但我想知道有多少数组/线性代数算法受益于某种自定义缓存遗忘 - 通常这些编写各种库以假定使用特定数据类型,如int32或float64,特别是基于高速缓存大小,并采用动态内存重新分配(如加倍)来分摊某些操作的成本。例如,您的链接文章提到在数组中找到最大值是"本质上"缓存无意义...因为它是连续的,您可以最大限度地使用您读取的每个缓存行,并且只读取最小数量的缓存行。也许对于像堆或其他东西一样处理数组,你可能会聪明地将内存布局重新排列为最佳,而不管缓存大小如何,但它不能成为通用数组的角色,使其实现自定义如此基于一个非常专业的用例(具有堆属性的数组)。

简而言之,我会回答你的问题并说,鉴于Python中标准的数据结构,你是否看到动态调整大小,动态类型和(可能最重要的)通用随机访问模式之间的特殊权衡假设与缓存无关的实现支持它们?