Python列表与STL类似的接口

ecl*_*rat 1 c++ python stl

我必须将C++ STL应用程序移植到Python.我是一个Python新手,但已编程超过十年.我对STL有很多经验,发现它让我迷上了使用C++.过去几天我一直在Google上搜索以下内容:

  1. Python STL(希望利用我多年的STL经验)
  2. Python链表
  3. Python高级列表用法
  4. Python列表优化
  5. Python有序集

并且已经找到了关于上述主题的帖子,关于Python列表的教程,这些教程明显没有进展,或者是死胡同.我对自己缺乏成功感到非常惊讶,我想我只是因为过度工作而进入了糟糕的搜索条件!

(我的问题)我可以获得Python STL包装器,或者像STL一样工作的Python列表的接口吗?如果没有,有人可以指向我一个真正的高级教程或论文来管理非常大的非平凡对象的集合?

PS我可以很容易地为一两个用途实现变通方法,但如果管理层希望移植更多代码,我想准备好立即用等效的Python代码替换我找到的任何STL代码.是的,我已经测量过并且需要完全具有最佳代码!我不能做冗余的搜索和搜索!

(附录)感谢您的回复,我已经查看了一些参考文献并很高兴.回应一些评论:

1 - 它正被移植到python,因为管理层这么说,我会尽快不管它 - 如果它不能解决,为什么要解决它?

2 - 使用非平凡对象的高级列表使用,我的意思是:许多不同的方式来订购和比较对象,而不是通过一个cmp方法.我想广泛地拼接,排序,合并,搜索,插入,擦除和组合列表.我想要列表迭代器列表,我想避免复制.

3 - 我现在知道内置列表实际上是数组,我应该寻找一个不同的python类.我认为这是我困惑的根源.

4 - 当然我正在学习以Python方式做事,但我也有最后期限.我正在移植的STL代码工作正常,我想尽可能少地改变它,因为这会引入错误.

感谢大家的投入,我真的很感激.

Ida*_*n K 13

如果我是你,我会花时间学习如何正确使用Python中可用的各种数据结构,而不是寻找类似于你从C++中知道的东西.

它不像你正在寻找一些花哨的东西,只是使用一些数据结构.在这种情况下,我会向您推荐有关该主题的Python文档.

这样做"Python"的方式可以帮助你,更重要的是未来的维护者,他们会想知道你为什么要尝试用Python编写C++.

只是为了激起你的食欲,但也没有理由偏爱 STL的风格到Python(并记录在案,我也是一个C++程序员谁throughly知道STL),可考虑构建一个列表,并遍历它最简单的例子:

Pythonic方式:

mylist = [1, 2, 3, 4]

for value in mylist:
    # playaround with value
Run Code Online (Sandbox Code Playgroud)

在Python中的STL方式(我做了这个,类似于STL):

mylist = [1, 2, 3, 4]
mylistiter = mylist.begin()

while mylistiter != mylist.end():
    value = mylistiter.item()
    mylistiter.next()
Run Code Online (Sandbox Code Playgroud)

  • STL方式是不显式迭代. (5认同)

Ale*_*lli 13

Python的"列表"不是链接列表 - 它们就像Java ArrayList或C++ std::vector,即在较低级别的术语中,是一个可调整大小的紧凑型指针数组.

关于此类主题的一个很好的"高级教程"是Hettinger的核心Python容器:引擎盖下的演示文稿(URL上的视频是在意大利会议上的演示文稿,但它是英文的;另一个,基本相同的演讲的简短演示在这里).

因此,Python列表的性能特征基本上是C++的性能特征std::vector:Python .append,如C++ push_back,是O(1),但插入或删除"中间"是O(N).因此,保持列表排序(可以通过Python的标准库模块bisect中的函数轻松完成)是昂贵的(如果项目随机到达和/或离开,每次插入和删除都是O(N),就像类似维护一样为了std::vector某些目的,例如优先级队列,你可以使用"堆队列",也可以通过Python的标准库模块heapq中的函数轻松维护- 但当然不是提供与完全排序列表(或向量)相同的用途范围.

因此,对于在C++中使用a std::set(并依赖于其被排序,即,hashset不会这样做 - Python的set基于散列,而不是有序)的目的,你可能最好避免使用Python内置容器喜欢这个模块的东西(如果你需要保持纯粹的Python),或者这个(它提供AVL树,而不是RB的,但被编码为C实现的Python扩展,因此可能提供更好的性能),如果C编码扩展是可以的.

如果您最终使用自己的模块(无论是纯Python还是C编码),如果您愿意,可以给它一个类似STL的胶合代码/接口(使用.begin,.end通过递增而不是通过递增的迭代器对象) ,按照正常的Python行为,通过调用他们的next方法,...),虽然它永远不会像语言那样"顺其自然"(该for语句被优化为使用普通的Python迭代器,即一个next方法,它将比while围绕非Python标准,类似STL的迭代器包装有点尴尬.

为了给任何Python内置容器提供类似STL的胶合代码,你将产生大量的包装开销,因此性能损失可能相当大.如果您,正如您所说,"需要完全具有最佳代码",那么仅仅出于"语法方便"的目的使用这样的胶合板似乎是一个非常糟糕的选择.

Boost Python是一个包含功能强大的C++ Boost库的Python扩展包,可能最适合您的目的.