改进Python比较和存在操作

时间:2011-06-07 14:20:38

标签: python c performance comparison binary-search

我对Python很新,并希望在向前推进之前能得到一些建议。我有一组整数,我想检查一个给定的元素是否尽可能快地包含在该组中(速度在这里很重要)。

使用Python,我应该考虑为这些操作(BST等)定制的自定义数据结构,python技巧,如使用any()包装,还是有任何众所周知的Python / C库是这类操作的标准事情。我不想在这里重新发明轮子,所以我很想听听在Python中使用它的常用方法。

多一点背景,元素都预先插入到组中,之后没有出现,因此插入时间无关紧要。这似乎意味着维护一个已排序的组并执行类似二进制搜索的操作将是最好的方法,但我确信这已经实现得比我实现的更有效,并且可以在Python / C lib中使用。有兴趣听听你们的想法。

谢谢!

2 个答案:

答案 0 :(得分:6)

最Pythonic的方法是不将它们存储在已排序的容器中,而是使用set(或不可变的变体frozenset)。这些是基于散列的容器,因此查找是O(1)。更重要的是,散列算法是Python中的核心操作之一(用于字典和属性查找),所以它用C语言编写,写成 fast

这通常是Python的情况。使用标准容器比在Python级别滚动自己更快,所以尽量使用它们。

如果您确实希望将它们存储在已排序的列表中,请查看标准库中的bisect模块。它具有二进制搜索的标准功能。 (好吧,实际上并非如此。我实际上返回了搜索项目所在的索引。你必须自己做最后的比较。)它可以在C中实现它们(取决于你的配置),所以它会比你自己写的要快。

答案 1 :(得分:6)

正如DMS在评论中所说,有一个内置的set(以及不可变的变体frozenset,它非常有用,您不需要变异并且可以适应生成的将值转换为单个生成器表达式)。它是基于散列的,因此牺牲了摊销的O(1)成员资格测试的顺序。它是用C语言编写的,并且有更多的时间用于使它快速合理地花费在它上面。如果内存服务正确,它基于字典实现,它实际上存在于紧急哈希表(常见用法)中。

请注意,“hash”部分也将是O(1),因为整数散列为自身。算法适合于非常好地处理“非随机”(例如,稍微连续)的散列。