最好使用元组或numpy数组来存储坐标

2024-09-25 12:25:28 发布

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

我将一个C++科学应用移植到Python上,因为我对Python是新手,我想到了一些问题:

1)我正在定义一个包含坐标(x,y)的类。这些值将被多次访问,但只有在类实例化之后才会读取它们。在内存和访问时间方面,使用元组还是numpy数组更好?在

2)在某些情况下,这些坐标将用于构建复数,在复函数上求值,并使用该函数的实部。假设x的复数部分可以直接用复数来存储吗?在python中从复杂到真实的转换的开销有多糟糕?c++中的代码执行了很多这样的转换,这是代码的一个很大的减速。在

3)还必须执行一些坐标转换,对于坐标,将分别访问x和y值,完成转换并返回结果。坐标变换是在复平面上定义的,所以直接使用x和y分量比依赖于复变量还要快吗?在

谢谢你


Tags: 实例函数内存代码numpy定义时间情况
2条回答

一个额外维度的numpy数组在内存使用上更为紧凑,而且至少同样快!,作为元组的numpy数组;复数至少和你的第三个问题一样好,甚至更好。顺便说一句,你可能已经注意到,虽然比你晚问的问题得到了大量的答案,但你却在休耕:毫无疑问,在一个问题中提出三个问题会让回答者感到厌烦。为什么不每个问题只问一个问题?你不是因为问题或任何事情而被起诉,你知道吗。。。!-)在

在内存消耗方面,numpy数组比Python元组更紧凑。 numpy数组使用一个连续的内存块。numpy数组的所有元素必须是声明的类型(例如32位或64位float)。Python tuple不一定使用连续的内存块,tuple的元素可以是任意Python对象,这些对象通常比numpy numeric类型消耗更多的内存。在

所以这个问题对numpy来说是一个轻而易举的胜利(假设数组的元素可以存储为numpy数字类型)。在

在速度问题上,我认为选择可以归结为一个问题,“你能将你的代码矢量化吗?”在

也就是说,你能把你的计算表达成对整个数组元素的运算吗。在

如果代码可以矢量化,那么numpy很可能比Python元组更快。(我唯一能想到的情况是,如果你有很多非常小的元组。在这种情况下,形成numpy数组的开销和导入numpy的一次性成本可能会淹没向量化的好处。)

无法矢量化的代码的一个例子是,如果计算涉及查看数组z中的第一个复数,执行一个生成整型索引idx的计算,然后检索{},对该数字进行计算,生成下一个索引idx2,然后检索{},等等。这种类型的计算可能无法矢量化。在这种情况下,您最好使用Python元组,因为您无法利用numpy的优势。在

我不担心访问复数实部/虚部的速度。我猜矢量化的问题很可能决定哪种方法更快。(不过,顺便说一句,numpy可以简单地将复数数组转换成它们的实部,只需跨过复数数组,每隔一个float跳过一次,并将结果视为float。而且,语法非常简单:如果z是一个复杂的numpy数组,那么z.real是float numpy数组的真正部分。这应该比使用纯Python方法对属性查找使用列表理解要快得多:[z.real for z in zlist]

只是出于好奇,你把C++代码移植到Python的原因是什么?在

相关问题 更多 >