在内存消耗方面,numpy 数组比 Python 元组更紧凑。numpy 数组使用单个连续的内存块。numpy 数组的所有元素都必须是声明类型(例如 32 位或 64 位浮点数)。Python 元组不一定使用连续的内存块,元组的元素可以是任意 Python 对象,这通常比 numpy 数字类型消耗更多的内存。
所以这个问题对于 numpy 来说是一个不折不扣的胜利,(假设数组的元素可以存储为 numpy 数字类型)。
关于速度问题,我认为选择归结为一个问题,“你能矢量化你的代码吗?”
也就是说,您能否将您的计算表达为对整个数组元素进行的操作。
如果代码可以向量化,那么 numpy 很可能会比 Python 元组更快。(我能想象到的唯一情况是,如果你有许多非常小的元组。在这种情况下,形成 numpy 数组的开销和导入 numpy 的一次性成本可能会淹没矢量化的好处。)
无法向量化的代码示例是,如果您的计算涉及查看,例如,数组中的第一个复数z
,进行生成整数索引的计算idx
,然后检索z[idx]
,对该数字进行计算,生成next index idx2
,然后 retrievingz[idx2]
等。这种类型的计算可能无法矢量化。在这种情况下,您不妨使用 Python 元组,因为您将无法利用 numpy 的优势。
我不会担心访问复数的实部/虚部的速度。我的猜测是矢量化问题很可能决定哪种方法更快。(不过,顺便说一句,numpy 可以将复数数组转换为实数部分,只需跨过复数数组,跳过每隔一个浮点数,并将结果视为浮点数。此外,语法非常简单:如果z
是复杂的 numpy 数组,然后z.real
是浮点 numpy 数组的实部。这应该比使用属性查找的列表理解的纯 Python 方法快得多:[z.real for z in zlist]
。)
只是出于好奇,您将 C++ 代码移植到 Python 的原因是什么?