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