我想将我已经编写的一些 Python 代码翻译成 C++ 或另一种快速语言,因为 Python 的速度不够快,无法完成我想做的事情。然而,有问题的代码滥用了 Python 集合的一些令人印象深刻的特性,特别是我在性能关键循环中发送垃圾邮件的平均 O(1) 成员资格测试,而且我不确定如何用另一种语言实现 Python 集合。
在Python 的 Time Complexity Wiki Page中,它指出集合平均具有 O(1) 成员资格测试,在最坏情况下为 O(n)。我亲自对此进行了测试timeit
,并且惊讶于 Python 集执行成员资格测试的速度之快,即使 N 很大。我查看了这个 Stack Overflow 答案,以了解 C++ 集在使用find
操作来查看元素是否是给定的成员时如何比较设置它说它是O(log(n))。
我假设时间复杂度find
是对数的,因为 C++ 标准库集是用某种二叉树实现的。我认为因为 Python 集具有平均 O(1) 成员资格测试和最坏情况 O(n),它们可能是用某种带有桶的关联数组实现的,它可以轻松查找一个元素并测试它的一些虚拟值这表明该元素不是集合的一部分。
问题是,我不想通过切换到另一种语言来减慢代码的任何部分(因为这是我试图首先解决的问题)所以我如何实现我自己的 Python 集版本(特别是只是快速会员测试)用另一种语言?有人知道 Python 集是如何实现的吗?如果不知道,谁能给我任何一般性的提示来指出正确的方向?
我不是在寻找源代码,只是在寻找有助于我入门的一般想法和链接。
我对关联数组进行了一些研究,我想我了解它们实现背后的基本思想,但我不确定它们的内存使用情况。如果 Python 集确实只是真正的关联数组,我如何以最少的内存使用来实现它们?
附加说明:我要使用的有问题的集合最多有 50,000 个元素,并且集合中的每个元素都在一个很大的范围内(比如 [-999999999, 999999999])。