gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:22:11 26 4
gpt4 key购买 nike

我正在将一个 C++ 科学应用程序移植到 python,由于我是 python 的新手,我想到了一些问题:

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

2) 在某些情况下,这些坐标将用于构建一个复数,对一个复函数求值,并使用该函数的实部。假设这个函数没有办法将实部和复数部分分开,而且最后必须使用实部,那么直接使用复数来存储(x,y)也许更好?在 Python 中从复杂到真实的转换开销有多严重? C++ 中的代码做了很多这样的转换,这大大降低了该代码的速度。

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

谢谢

最佳答案

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

所以这个问题是 numpy 的胜利,(假设数组的元素可以存储为 numpy 数字类型)。

关于速度问题,我认为选择归结为“你能向量化你的代码吗?”这个问题

也就是说,您能否将您的计算表达为对整个数组元素进行的操作。

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

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

我不会担心访问复数的实部/虚部的速度。我的猜测是矢量化问题很可能会决定哪种方法更快。 (不过,顺便说一句,numpy 可以简单地通过跨越复数数组,跳过所有其他 float ,并将结果视为 float ,将复数数组转换为其实数部分。此外,语法非常简单:如果 z 是一个复杂的 numpy 数组,然后 z.real 是一个 float numpy 数组的实部。这应该比使用属性列表理解的纯 Python 方法快得多查找:[zlist 中 z 的 z.real]。)

出于好奇,您将 C++ 代码移植到 Python 的原因是什么?

关于python - 最好使用元组或 numpy 数组来存储坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2563773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com