Skip to main content
 首页 » 编程设计

python之Pharo 中的高性能 Python 集合

2024年09月07日37wayfarer

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

柜台就是一个袋子

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

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

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

(defaultdict 可用于使用多个键创建树):

d[key1][key2][key3] = value 

双端队列(Deque):支持从任意一端添加和删除元素

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

请您参考如下方法:

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

简短的回答是肯定的,你的假设是正确的,Count是Bag , OrderedDict是OrderedDictionary等

更详尽的答案至少应包括一些示例。

Bag

这是一个跟踪重复项的无序集合(又名 occurrences)

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正是以这种方式实现的,因此无需重新实现这些集合。

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

set := Set new. 
set add: 3; add: 3. 
set asArray = #(3) 

同时

bag := Bag new. 
bag add: 3; add: 3. 
bag asArray = #(3 3) 

有序字典

Dictionary之间的区别和一个 OrderedDictionary就是前者是无序的,而后者是记住加法顺序的。因此,它们也表现为 OrderedCollections , 除了在这种情况下键是隐式索引1 , 2等(回想一下,在 Smalltalk 中索引总是基于 1 的。)我们为拥有这两个特性(通用键和排序)付出的代价主要是 values 的重复。收藏。但请注意,实现这些对象有不同的选择。

dictionary := OrderedDictionary new. 
dictionary 
   at: 'c' put: 'CC'; 
   at: 'b' put: 'BB'; 
   at: 'a' put: 'AA'. 
dictionary asArray = #('CC' 'BB' 'AA') 

不过

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因此很容易预见值(value)的内在分配。