首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Pharo中的高性能Python集合

Pharo中的高性能Python集合
EN

Stack Overflow用户
提问于 2018-07-19 12:57:47
回答 1查看 282关注 0票数 2

我尽量避免在这里重复发明轮子。我想确认哪些高性能的python集合是Pharo中最接近的亲缘关系:

A Counter is a Bag

保持元素插入顺序的字典:

  • Python: OrderedDict
  • Pharo: OrderedDictionary (在官方图片中)

默认字典是创建您尝试访问的任何项目的字典

(可以使用defaultdict通过多个key创建树):

代码语言:javascript
复制
d[key1][key2][key3] = value

双端队列(Deque):支持在任意一端队列()中添加和移除元素

双端队列:https://docs.python.org/2/library/collections.html#deque-objects

  • Pharo: OrderedCollection?

  • Python

我的假设是正确的吗?是否有另一个Collection子类可以更好地替代上述情况?

EN

回答 1

Stack Overflow用户

发布于 2018-08-08 09:10:33

这个问题有两个不同的答案。一个简短,另一个更详细。

简短的答案是肯定的,你的假设是正确的,CountBagOrderedDictOrderedDictionary,依此类推。

一个更详细的答案应该至少包括一些例子。

Bag

这是一个无序集合,用于跟踪重复操作(也称为occurrences)

代码语言:javascript
复制
bag := Bag new.
bag add: 'Hello'; add: 3; add: 'Hello'.
self
  assert: (bag occurrencesOf: 'Hello') = 2;
  assert: (bag occurrencesOf: 3) = 1;
  assert: (bag occurrencesOf: 'foo') = 0

不熟悉Bag的人倾向于使用Dictionary来计算重复次数。这不是必需的,Bags就是以这种方式实现的,所以不需要重新实现这些集合。

请注意BagSet之间的区别。虽然两者都是无序的,但后者将只保留同一实例的一个条目:

代码语言:javascript
复制
set := Set new.
set add: 3; add: 3.
set asArray = #(3)

代码语言:javascript
复制
bag := Bag new.
bag add: 3; add: 3.
bag asArray = #(3 3)

OrderedDictionary

DictionaryOrderedDictionary的区别在于前者是无序的,而后者会记住加法的顺序。因此,它们的行为也类似于OrderedCollections,除了在本例中键是隐式的索引12等(回想一下,在Smalltalk中索引总是1-based )。我们为拥有这两个特性(通用密钥和排序)而付出的代价主要是复制values集合。但是请注意,实现这些对象有不同的替代方案。

代码语言:javascript
复制
dictionary := OrderedDictionary new.
dictionary
   at: 'c' put: 'CC';
   at: 'b' put: 'BB';
   at: 'a' put: 'AA'.
dictionary asArray = #('CC' 'BB' 'AA')

然而,

代码语言:javascript
复制
dictionary := Dictionary new.
dictionary
   at: 'c' put: 'CC';
   at: 'b' put: 'BB';
   at: 'a' put: 'AA'.
dictionary asArray = #('AA' 'BB' 'CC')

基本上是因为'a' hash < 'b' hash < 'c' hash,因此很容易预见到值的内部分配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51414622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档