Python数组缓存与C数组缓存

2024-09-28 22:33:40 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python方面相当缺乏经验,我意识到这是非常基本的,但是Python缓存块与C相比有多好?例如,在C中:

gridWidth = 100000
gridHeight = 100000

for (i=0; i<gridHeight; i++){

    for (j=0; j<gridWidth; j++){

       massiveNum += arr[i*gridWidth + j]
    }
}

^{pr2}$

因为数据在第一次缓存时是高效的。在

如果我在Python中使用同样的速度,我可以做一些简单的事情吗

for i in range(0,gridHeight):

    for j in range(0,gridWidth):

       massiveNum += arr[i*gridWidth + j]

或者我有什么特别的事要做吗?在


Tags: 数据inforrange事情速度arr意识
3条回答

如果你说的是Python数组,那么我会假设它们在内存中是线性的,所以是的,顺序访问是访问它们的最友好的缓存方式。在

如果你在谈论Python列表,我会认为Python列表和其中的对象不可能在内存中以线性方式排列。由于列表中的每一项都可以是任何类型的,它最多看起来像一个指针的线性数组—因此实际访问每个项可能会在内存中跳转。在

此外,Python的一般开销可能使任何缓存效果都可以忽略不计。在

您可能还需要优化循环:

n = gridHeight * gridWidth
i = 0
while i < n:
    massiveNum += arr[i]
    i += 1

内部循环使用j作为索引,因此当数组的相邻部分按j的相邻值建立索引时,将获得最佳的缓存性能。这是通过乘以i而不是j来实现的。在

由于数组是一维的,所以这个问题完全与语言无关,缓存是由处理器处理的,而不是语言。如果你使用的是二维数组,你可能会得到不同的答案。在

你的问题毫无意义。当你在你的代码和机器之间有一个完整的解释器、装箱数字类型、所述类型的堆分配等等时,缓存效率是你最不担心的。由于Python的内置序列类型在幕后使用(动态和过度分配)C数组,因此应该应用相同的规则,但是有两个主要的注意事项:

  • 对于每一个Python操作(例如类型检查、变量和成员查找、在调用方法之前创建“绑定方法”对象、数字强制)都有大量的“隐藏”内存访问,这可能会降低其好处。在
  • 在许多情况下(即,除非另有说明),所有容器都存储对装箱对象的引用,因此当您迭代int对象的list时,CPU缓存只能帮助更快地获取这些指针,而不能处理这些指针后面的对象。在

如果你能测量出任何差别,我会很惊讶的。如果你想优化的话,有很多事情是一千倍更有效和更明显的。使用内置、NumPy、编写一点C语言、使用Cython,或者简单地优化Python代码。在

相关问题 更多 >