在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]
或者我有什么特别的事要做吗?在
如果你说的是Python数组,那么我会假设它们在内存中是线性的,所以是的,顺序访问是访问它们的最友好的缓存方式。在
如果你在谈论Python列表,我会认为Python列表和其中的对象不可能在内存中以线性方式排列。由于列表中的每一项都可以是任何类型的,它最多看起来像一个指针的线性数组—因此实际访问每个项可能会在内存中跳转。在
此外,Python的一般开销可能使任何缓存效果都可以忽略不计。在
您可能还需要优化循环:
内部循环使用
j
作为索引,因此当数组的相邻部分按j
的相邻值建立索引时,将获得最佳的缓存性能。这是通过乘以i
而不是j
来实现的。在由于数组是一维的,所以这个问题完全与语言无关,缓存是由处理器处理的,而不是语言。如果你使用的是二维数组,你可能会得到不同的答案。在
你的问题毫无意义。当你在你的代码和机器之间有一个完整的解释器、装箱数字类型、所述类型的堆分配等等时,缓存效率是你最不担心的。由于Python的内置序列类型在幕后使用(动态和过度分配)C数组,因此应该应用相同的规则,但是有两个主要的注意事项:
int
对象的list
时,CPU缓存只能帮助更快地获取这些指针,而不能处理这些指针后面的对象。在如果你能测量出任何差别,我会很惊讶的。如果你想优化的话,有很多事情是一千倍更有效和更明显的。使用内置、NumPy、编写一点C语言、使用Cython,或者简单地优化Python代码。在
相关问题 更多 >
编程相关推荐